CCF2016

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/arthu6/article/details/84782639

4.1.

折点计数

思路:极值点左右单调性不一致

代码

#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
    int n,c,i;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    c=0;
    for(i=1;i<n-1;i++)
    {
        if(((a[i]-a[i-1])<0)&&((a[i+1]-a[i])>0)||((a[i]-a[i-1])>0)&&((a[i+1]-a[i])<0))//左右增减不同
            c++;
    }
    cout<<c<<endl;
    return 0;
}

9.2

火车购票

思路:先找连续的,再找不连续的位置

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[105];
int b[20][5];
void FindSet(int n)
{
    int i,j,t,k;
    //找连续的
    for(i=0;i<20;i++)
    {
        k=0;
        for(j=0;j<5&&k<n;j++)
        {
            if(b[i][j]==0) k++;
        }
        if(k==n)
            {
                for(t=j-k;t<j;t++)
                {
                    b[i][t]=1;//坐人
                    cout<<5*i+t+1<<" ";
                }
                break;
            }
    }
    if(i>=20)//找不连续的
    {
        k=0;
        for(i=0;i<20;i++)
        {
            for(j=0;j<5&&k<n;j++)
            {
                if(b[i][j]==0)
                {
                    cout<<5*i+j+1<<" ";
                    b[i][j]=1;//坐人
                    k++;
                }
            }
            if(k==n) break;
        }
    }
    cout<<endl;
}
int main()
{
    int n,c,i,j,sum;
    cin>>n;
    for(i=0;i<n;i++)
        {
            cin>>a[i];
        }

   for(i=0;i<20;i++)//座位
   {
       for(j=0;j<5;j++)
       {
           b[i][j]=0;
       }
   }
   sum=0;
   for(i=0;i<n;i++)
   {
       sum+=a[i];
       if(sum<=100)//可以订票
       {
           FindSet(a[i]);
       }
   }
    return 0;
}

12.1

思路:排序分奇偶,考虑中间元素在左右的分布是否均匀即可

代码:
 

#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
	int n,i,c,b,t,flag;
	cin>>n;
	for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    t=a[n/2];
    if(n%2==0) flag=-1;
    else flag=0;
    c=b=0;
    for(i=n/2+flag;i>=0;i--)
    {
        if(a[i]==t) c++;
        else break;
    }
    for(i=n/2;i<n;i++)
    {
        if(a[i]==t) b++;
        else break;
    }
    if(c==b)
        cout<<t<<endl;
    else
        cout<<-1<<endl;
	return 0;
}

12.2

思路一(只有60分):对税后工资分段,取最后一段换算,求得税前工资

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int S,T,c;
    double sum;
    cin>>T;
    c=T-3500;
    if(c<=1500)
    {
        sum=c/0.97;
        S=sum+3500;
    }
    else if(c<=4500)
    {
        c-=1455;
        sum=c/0.9;
        S=sum+3500+1500;
    }
    else if(c<=9000)
    {
        c-=4155;
        sum=c/0.8;
        S=sum+3500+4500;
    }
    else if(c<=35000)
    {
        c-=7755;
        sum=c/0.75;
        S=sum+3500+9000;
    }
    else if(c<=55000)
    {
        c-=27255;
        sum=c/0.7;
        S=sum+3500+35000;
    }
    else if(c<=80000)
    {
        c-=41255;
        sum=c/0.65;
        S=sum+3500+55000;
    }
    else
    {
        c-=53505;
        sum=c/0.55;
        S=sum+3500+80000;
    }
    cout<<S<<endl;
    return 0;
}

思路二(枚举法):用3500~100000间的数一个个试

代码:

#include<iostream>
using namespace std;
int main()
{
	int T,S;
	cin>>T;
	if(T<=3500)
		cout<<T<<endl;
	else
	{
		for(int i=3600;i<1000000;i+=100)
		{
			int S=0;
			if(i<=5000)
                S=(i-3500)*0.03;
			else if(i<=8000)
                S=(i-3500-1500)*0.1+45;
			else if(i<=12500)
                S=(i-3500-4500)*0.2+300+45;
			else if(i<=38500)
                S=(i-3500-9000)*0.25+900+300+45;
			else if(i<=58500)
                S=(i-3500-35000)*0.3+6500+900+300+45;
			else if(i<=83500)
                S=(i-3500-55000)*0.35+6000+6500+900+300+45;
			else
                S=(i-83500)*0.45+8750+6000+6500+900+300+45;
			if((i-S)==T)
			{
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/arthu6/article/details/84782639