Codeforces Round #452 (Div. 2) 12-17 A-C 题解

来源:互联网 发布:java正则表达式捕获组 编辑:程序博客网 时间:2024/06/14 11:03
鉴于本人还是个CF黑名小菜鸟,可能写得格式不太好,思路也可能不清晰,
希望能有更多大牛指教指教,#452(DIV 2)还是可以做A 到C 。
A. Splitting in Teams

题解:@1.     给你N个数据,  数据1或2。  3人成一个队。
@2.       1可以随便组队,     但2就不能拆开。

分析:  @1,  判断0的情况,                                             
                       a、全是2     b、 或者 2个1                                              
@2,判断1的情况,                                 
     只有可能  n=2, 1个1  和  1个2    3个1               
@3,判断其他情况‘、                                  
a、num  2  >= num  1   时只能由1来决定。
          b、num   1>=num 2  先把2的全凑合,剩下的1/3.
#include<bits/stdc++.h>using namespace std;int main(){     int n,a[1000000],vis[3]={0};     scanf("%d",&n);     for(int i=0;i<n;i++)     {         scanf("%d",&a[i]);         vis[a[i]]++;     }     if((n==2&&vis[1]!=vis[2])||(vis[1]==0))     {          printf("0\n");     }     else if(n==2&&vis[1]==vis[2])     {         printf("1\n");     }     else if(vis[2]>=vis[1])     {         printf("%d\n",vis[1]);     }     else if(vis[1]>vis[2])     {           int ans=vis[2]+(vis[1]-vis[2])/3;           printf("%d\n",ans);     }     return 0;}
B. Months and Years
题解:先介绍了别人的日历是和国际接轨之后,出了个 n<24 的范围来考我们这些月份是否合法的。
分析:菜鸟没啥好方法,就是懂得暴力求解,把36个月列出来,如果有29天的存在就要特判,
@1、29出现两次,直接不合法,                                                                                              
@2、29出现过一次的话,把36个月中的每个2月都更新一次,记得把原来的还原成28;             


#include<bits/stdc++.h>using namespace std;int main(){     int b[36]=        {        31,28,31,30,31,30,31,31,30,31,30,31,        31,28,31,30,31,30,31,31,30,31,30,31,        31,28,31,30,31,30,31,31,30,31,30,31        };     int n,flag=0,a[30];     scanf("%d",&n);     int vis[35]={0};     for(int i=0;i<n;i++)     {          scanf("%d",&a[i]);             vis[a[i]]++;     }     if(vis[29]==2)     {         printf("NO\n");         return 0;     }     else     {        int k,j;       for(int i=0;i<36&&!flag;i=k+1)       {           k=i;          if(vis[29]==1)          {              b[1]=29;              b[13]=28;              b[25]=28;          }          int count=0;           j=0;          while(b[i]==a[j]&&j<n)          {              count++;              i++;j++;          }          if(count==n)          {              flag=1;          }       }       for(int i=0;i<36&&!flag;i=k+1)       {             k=i;          if(vis[29]==1)          {              b[1]=28;              b[13]=29;              b[25]=28;          }          int count=0;           j=0;          while(b[i]==a[j]&&j<n)          {              count++;              i++;j++;          }          if(count==n)          {              flag=1;          }       }       for(int i=0;i<36&&!flag;i=k+1)       {           k=i;          if(vis[29]==1)          {              b[1]=28;              b[13]=28;              b[25]=29;          }          int count=0;           j=0;          while(b[i]==a[j]&&j<n)          {              count++;              i++;j++;          }          if(count==n)          {              flag=1;          }       }       if(flag==1)       {           printf("YES\n");       }       else       {           printf("NO\n");       }     }}



C. Dividing the numbers
题解:就是把  1到n  分两份,                                                                    
第一行输出是  两份求和后  之间的差值,                                                    
第二行符合条件的一份    先一个  个数  后是   符合条件的一组数。             

做这题时吃了文化的亏,any of them 让我好好琢磨了半天。                      
才知道原来输出符合条件的一组就可以了。                                                 
     
分析:看图

#include<bits/stdc++.h>int main(){     int i,n,ans[60050];     while(~scanf("%d",&n))     {           if(n%2==0)           {                if((n/2)%2==1)                {                    printf("1\n%d ",n/2);                    int cnt=1;                    for(i=3;i<=n/2&&n!=2;i++)                    {                        if(i%2==1)                        {                            ans[cnt++]=i;                            ans[cnt++]=n-i+3;                        }                    }                    if(n==2)                    {                       printf("1\n");                    }                    else                    {                       printf("1 ");                    }                    for(i=1;i<cnt;i++)                    {                         printf(i==cnt-1?"%d\n":"%d ",ans[i]);                    }                }                else                {                    printf("0\n%d ",n/2);                    int cnt=1;                    for(i=1;i<=n/2;i++)                    {                        if(i%2==1)                        {                             ans[cnt++]=i;                             ans[cnt++]=n-i+1;                        }                    }                     for(i=1;i<cnt;i++)                    {                         printf(i==cnt-1?"%d\n":"%d ",ans[i]);                    }                }           }           else           {                if(((n-1)/2)%2==1)                {                    printf("0\n%d ",n/2);                    int cnt=1;                    int k=n+3;                    for(i=4;i<=k/2;i++)                    {                        if(i%2==0)                        {                            ans[cnt++]=i;                            ans[cnt++]=k-i+1;                        }                    }                    printf(n==3?"3\n":"3 ");                    for(i=1;i<cnt;i++)                    {                         printf(i==cnt-1?"%d\n":"%d ",ans[i]);                    }                }                else                {                    printf("1\n%d ",n/2);                    int cnt=1;                    for(i=2;i<=n/2;i++)                    {                        if(i%2==0)                        {                            ans[cnt++]=i;                            ans[cnt++]=n-i+2;                        }                    }                    for(i=1;i<cnt;i++)                    {                         printf(i==cnt-1?"%d\n":"%d ",ans[i]);                    }                }           }     }     return 0;}