CodeForces 22、23部分题解

来源:互联网 发布:unity3d上海 编辑:程序博客网 时间:2024/05/03 07:03

 CodeForces 22A

      找严格第二小的。。。注意只有一种情况,可以sort排序然后unique输出。

int a[N];int main(){    int n;    while(~scanf("%d",&n))   {       for(int i=0;i<n;i++)        scanf("%d",&a[i]);       sort(a,a+n);       if(n==1||a[0]==a[n-1]) printf("NO\n");       else       {           unique(a,a+n)-a;           printf("%d\n",a[1]);       }   }   return 0;}


CodeForces 23A

   找子集中出现次数最多的,只求一个数量,数据范围只有100,用map<string,int>。

const int N=1e6+10;int main(){     string a;     cin>>a;     map<string,int>q;     int len=(int)a.size();     int ma=0;     for(int i=0;i<len;i++)        for(int j=0;j<len;j++)//枚举所有区间。。     {         string s;         for(int k=i;k<=j;k++)            s+=a[k];         q[s]++;         if(q[s]>=2) ma=max(ma,j-i+1);     }      printf("%d\n",ma);}//写起来是方便,不过时间复杂度略高。。

                                  

                                                                 CodeForces 23B

      规律题,,开始没看懂题意,,CF上的标签是构图。于是枚举了几组,大胆猜想了一下结果是(n-2),1A。

int main(){  int t,n;  scanf("%d",&t);  while(t--)  {scanf("%d",&n);     if(n<=2) printf("0\n");     else printf("%d\n",n-2);  }  return 0;}


                                                            CodeForces 23C

     这题真心不错,题意很好懂,但没思路。。

     题意:有2n-1个箱子,每个箱子里有一定数量的苹果和橘子。问是否存在一种方案选n个箱子使得苹果的数量不小于苹果总数的一半并且橘子的数量不小于橘子总数的一半。。

     思路:排序即可,不管按橘子数递增或者苹果数递增。接下来证明:首先下标从1开始,2n-1一定是奇数,排序后最优情况一定要选最后一个。我们有两种选法:①选所有的奇数,②选所有的偶数和最后一个奇数箱子(因为要选n个箱子)。一下我们按橘子数递增排序(按苹果数一样的)进行讨论,很容易证明:一号方案和二号方案橘子数肯定符合条件的,比如总共有5个箱子,那么选奇数的话:橘子数a1+a3+a5>a2+a4,如果选偶数:a2+a4+a5>a1+a3.那接下来看苹果数咯,苹果数只有两种情况,所以这两种方案必有一种符合。

const int N=1e7+10;struct zz{    int x,y,id;} a[N];int cmp1(zz a,zz b){    return a.x<b.x;}int main(){    int t,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        ll sum1=0,sum2=0;        for(int i=1; i<=2*n-1; i++)        {            scanf("%d%d",&a[i].x,&a[i].y);            a[i].id=i;            sum1+=a[i].x,sum2+=a[i].y;        }        sort(a+1,a+2*n,cmp1);        ll s1=0,s2=0;        for(int i=1; i<=2*n-1; i+=2)        {            s1+=a[i].x;            s2+=a[i].y;        }        printf("YES\n");//必然存在符合条件的情况。        if(s1*2>=sum1&&s2*2>=sum2)        {            for(int i=1;i<=2*n-1;i+=2)            {                printf("%d ",a[i].id);            }        }        else        {           for(int i=2;i<=2*n-1;i+=2)            {                printf("%d ",a[i].id);            }            printf("%d",a[2*n-1].id);        }        printf("\n");    }    return 0;}

 水题之路。。整天水题不会有提高的。。还是多学几个牛逼的算法吧!

0 0
原创粉丝点击