2017ACM-TC联合第一次招新赛题解

http://acm.nyist.me/OJ/contest.php?cid=1033


绝望的riba2534
素数打表
#include
using namespace std;
int a[11000];//素数表
int b[11000];
int main()
{
    memset(a,0,sizeof(a));
    a[0]=a[1]=1;//0和1都不是素数
    for(int i=2;i<=10000;i++)
    {
        if(a[i]==0)
        {
        for(int j=i*i;j<=10000;j+=i)
        {
            a[j]=1;
        }
        }
    }
    int n;
    while(~scanf("%d",&n))
    {
        int k=0,o;
        for(int i=0;i         {
        scanf("%d",&o);
        if(a[o])
        {
            b[k]=o;
            k++;
        }
        }
        sort(b,b+k);
        for(int i=0;i         {
            if(i==0)
            printf("%d",b[i]);
            else
                printf(" %d",b[i]);
        }
        printf("\n");
    }
}





CTX学长的01串
#include
using namespace std;
const long long mod=1000000007;
char s[110000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int k=strlen(s);
        long long a=0,b=0,c=0,d=1;
        long long sum=0;
       for(int i=0;i        {
           if(s[i]=='0')
           {
               a+=b;
               c+=d;
               d+=b;
               b=0;
           }
           else if(s[i]=='1')
           {
               a+=c;
               b+=d;
               d+=c;
               c=0;
           }
           a%=mod;
           b%=mod;
           c%=mod;
           d%=mod;
       }
       sum=(a+b+c+d-1)%mod;
       printf("%lld\n",sum);
    }
}




你说什么?我不会a+b?


可以用大数a+b 也可以用  unsigned long long  
#include
using namespace std;
int main()
{
    unsigned long long a,b;
   while(cin>>a>>b)
   {
       cout<    }
}




我不喊麦,我叫MC李白
因为是奇数个奇数相加 所以 如果n为偶 肯定不行 
如果n为奇  为了划分所有数 开头和结尾的数肯定要为奇 不然无法全部划分
如果开头和结尾为奇且n为奇则可以直接选择全部划分为1段
#include
using namespace std;
int main()
{
    int t,n;
    long long a;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int o=1;
        for(int i=1;i<=n;i++)
        {
           scanf("%lld",&a);
           if(i==1||i==n)//开头和结尾判断就行
           {
               if(a%2==0)  
               {
                   o=0; //有一个为偶就不行
               }
           }
        }
        if(n%2==0)
        {
            printf("No\n");
            continue;
        }
        if(o)
            printf("Yes\n");
        else
            printf("No\n");
    }
}






ZXY的万年历
求隔了几天设 ans  
比如 2016-02-29  到  2018-02-28
先算2016年过了几天 然后 ans - = 天数
然后算 2017年过了几天  然后 ans + =天数
然后算他们之间的年份  有两年 2016 和2017  然后分别判断是否为闰 为闰+366    不为闰 +365       
#include
using namespace std;
int a[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int aa(int x)//判断闰年
{
    if(x%400==0||x%4==0&&x%100!=0)
        return 1;
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int x1,y1,z1;
        int x2,y2,z2;
        scanf("%d-%d-%d",&x1,&y1,&z1);
        scanf("%d-%d-%d",&x2,&y2,&z2);
        int ans=z2-z1;
        for(int i=1;i         {
            if(i==2)
            {
                if(aa(x1))
                    ans-=29;
                else
                    ans-=28;
            }
            else
                ans-=a[i];
        }
        for(int i=1;i         {
             if(i==2)
            {
                if(aa(x2))
                    ans+=29;
                else
                    ans+=28;
            }
            else
                ans+=a[i];
        }
        for(int i=x1;i         {
            if(aa(i))
            ans+=366;
            else
                ans+=365;
        }
            printf("%d\n",ans);
    }
}


一种排序
#include
using namespace std;
struct node
{
    int x,y,z;//x为编号 ,y 为长 ,z为宽
}a[1100];
int cmp(node a,node b) 
{
    if(a.x==b.x) //先按编号排
    {
        if(a.y==b.y) //按长排
          return a.z         return a.y     }
    return a.x }
int main()
{
    int t,n,x,y,z;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int kk=0;
        for(int i=0;i         {
            scanf("%d%d%d",&a[i].x,&y,&z);
            if(y>=z)//长的为矩形的长,短的为宽
            {
                a[i].y=y;
                a[i].z=z;
            }
            else
            {
                a[i].y=z;
                a[i].z=y;
            }


        }
        sort(a,a+n,cmp);
        printf("%d %d %d\n",a[0].x,a[0].y,a[0].z);
        for(int i=1;i         {
            if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y&&a[i].z==a[i-1].z)//如果后一个和前一个完全一样  不输出
                continue;
            printf("%d %d %d\n",a[i].x,a[i].y,a[i].z);


        }
    }
}


爱玩魔方的ZXY
#include
using namespace std;
char a[110][110];
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i         {
            scanf("%s",a[i]);
        }
        for(int i=0;i         {
            for(int j=0;j             {
                if(a[i][j]                 {
                    swap(a[i][j],a[j][i]);//交换
                }
            }
        }
         for(int i=0;i         {
            printf("%s\n",a[i]);
        }
    }
}




wjh的生日


#include
using namespace std;
int a[100];
int main()
{
  int n,m;
  while(~scanf("%d%d",&n,&m))
  {
      int ma=0,p=0;
      for(int i=0;i       {
          scanf("%d",&a[i]);
          ma=max(a[i],ma);
      }
      for(int i=ma;i>=1;i--)//枚举从最大的蛋糕开始到1为止是否存在一个蛋糕大小能满足分给每个人
      {
          int k=0;//能分出每块蛋糕大小是 i 的数
          for(int j=0;j           {
              k+=(a[j]/i); //看每一部分能分出几个满足要求的蛋糕
          }


          if(k>=m) //如果分出蛋糕总数大于等于m
          {
              p=1;
              printf("%d\n",i);
              break;
          }
      }
      if(p==0)
      {
          printf("0\n");
      }
  }
}




幸运的dly学姐
#include
using namespace std;
char a[510];
char b[210];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int o=0;
        scanf("%s",a);
        scanf("%s",b);
        for(int i=0;i<=n-4;i++)//遍历长串
        {
            if(a[i]==b[0]&&a[i+1]==b[1]&&a[i+2]==b[2]&&a[i+3]==b[3])//如果长串中有连续4个完全和所求串相同的部分
            {
                o=1;
                printf("%d\n",i+1);
                 break;
            }
        }
        if(!o)
            printf("NO\n");
    }
}








笨笨熊的学习之路——元素周期表
#include
using namespace std;
string aa[12];
char bb[1100][33];
int main()
{
    aa[0]="nil",aa[1]="un",aa[2]="bi",aa[3]="tri",aa[4]="quad";
    aa[5]="pent",aa[6]="hex",aa[7]="sept",aa[8]="oct",aa[9]="enn";
    aa[10]="ium"; 
    for(int i=100;i<=999;i++)
    {
        int a=i/100;//百位
        int b=i/10-a*10;//十位
        int c=i%10;//个位
        int k=0;
        for(int j=0;j         {
          bb[i][k]=aa[a][j];
          k++;
        }
        bb[i][0]-=32; //第一位大写
        for(int j=0;j         {
            if(j==0&&bb[i][k-1]==aa[b][0])//前面数字名称的最后一位和后面数字名称的第一位相同,则需去掉一个相同的
                continue;
          bb[i][k]=aa[b][j];
          k++;
        }
         for(int j=0;j         {
            if(j==0&&bb[i][k-1]==aa[c][0])
                continue;
          bb[i][k]=aa[c][j];
          k++;
        }
          for(int j=0;j         {
          bb[i][k]=aa[10][j];
          k++;
        }
    }
    int t,n,p;
    char s[33];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        if(n==1)
        {
          scanf("%d",&p);
          printf("%s\n",bb[p]);
        }
        else
        {
          scanf("%s",s);
          for(int i=101;i<1000;i++)
          {
              if(strcmp(bb[i],s)==0)
              {
                  printf("%d\n",i);
                  break;
              }
          }
        }
    }
}










数字,字母?
#include
using namespace std;
char a[1100];
int main()
{
    while(~scanf("%s",a))
    {
        int k=strlen(a);
        for(int i=0;i         {
            if(a[i]>='0'&&a[i]<='9')
                printf("%c",a[i]);
        }
        printf("\n");
    }
}


你可能感兴趣的:(2017ACM-TC联合第一次招新赛题解)