CodeForces 22、23部分题解

 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值