NYIST--2018大一新生第一次周赛题解

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

比赛链接:https://cn.vjudge.net/contest/261258 

密码:nyist


 A - Thickest Burger   

厚的肉排乘2加上薄的肉排

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);  
    while(t--)  //t组输入
    {
        int x,y;
        int ans=0;    
        scanf("%d%d",&x,&y);
        if(x>=y)
            ans=2*x+y;
        if(x<y)
            ans=2*y+x;
        printf("%d\n",ans);
    }
  return 0;
}

B - Relative atomic mass

思路:把化学式中的每个元素的相对原子质量相加
 

#include<stdio.h>
#include<string.h>
int main()
{
    int t;
    scanf("%d",&t);
    char a[20]={0};
    while(t--)
    {
        scanf("%s",a);
        int len=strlen(a);  //字符串长度
        int ans=0;
        for(int i=0;i<len;i++)
        {
            if(a[i]=='H')  
               ans++;
            else if(a[i]=='C')
                ans+=12;
            else if(a[i]=='O')
                ans+=16;
        }
        printf("%d\n",ans);
    }
    return 0;
}

C - 分拆素数和

素数筛法把素数标记,然后暴力判断。如果i 和(x-i)都是素数ans加一。

#include<stdio.h>
const int N=10010;
int s[N];
void init()  //素数筛法
{
    int i,j;
    s[0]=s[1]=1;
    for(i=2;i<N;i++)
    {
        if(!s[i])
        {
            for(j=i+i;j<=N;j+=i)
                s[j]=1;
        }
    }
}
int main()
{

    int x;
    while(~scanf("%d",&x))
    {
        if(x==0)
            return 0;
        init();
        int ans=0;
        for(int i=2;i<x/2;i++)
        {
            if(s[i]==0)
            {
                if(s[x-i]==0)
                    ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

D - 小明A+B

对于要计算的数,直接对100取模,然后相加即可

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int x,y,a,b,c;
        scanf("%d%d",&x,&y);
        a=x%100;
        b=y%100;
        c=a+b;
        printf("%d\n",c%100);
    }
    return 0;
}

E - 整数解

两种方法:
1.暴力(不建议)

2数学方法 :

已知:x+y=n  xy=m      (x - y )^2 = n^2 - 4*m   联立x+y=n 求得x y

代码1:
 

#include<stdio.h>
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)
            return 0;
        int flag=0;
        for(int i=-10000; i<=10000; i++)
        {
            if(i*(n-i)==m)
            {
                printf("Yes\n");
                flag=1;
                break;
            }
        }
        if(flag==0)
            printf("No\n");
    }
    return 0;
}

 代码2:

#include<stdio.h>
#include<math.h>
int main()
{
    int n,m,x1,x2,y1,y2,tmp;
    while(~scanf("%d%d",&n,&m))
    {
		if(n==0&&m==0)
			break;
        tmp=sqrt(1.0*n*n-4*m);
        if(tmp<0)
			printf("No\n");
        else
        {
            x1=(n+tmp)/2;
            y1=n-x1;
            x2=(n-tmp)/2;
            y2=n-x2;
            if(x1*y1==m||x2*y2==m)
                printf("Yes\n");
            else
				printf("No\n");
        }
    }
    return 0;
}

- 夹角有多大II

运用向量知识,利用两条边来计算夹角

#include<stdio.h>
#include<math.h>
#define PI 3.1415926535;
int main()
{
    int t;
    while(~scanf("%d",&t))
    {
        while(t--)
        {
            double x1,y1,x2,y2,a,b,c;
            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            a=x1*x2+y1*y2;
            b=sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2);
            c=acos(a/b)/PI;  //反余弦函数
            c*=180;
            printf("%.2lf\n",c);
        }
    }
    return 0;
}

G - 手机短号

字符串的输出

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char a[11];
        scanf("%s",a);
        printf("6%s\n",a+6);
      }
     return 0;
}

H - C语言合法标识符

#include<stdio.h>
#include<string.h>
char a[65];
int main()
{
    int n,i,l;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        int flag=0;
       gets(a);
       l=strlen(a);
      if(a[0]=='_'||a[0]>='a'&&a[0]<='z'||a[0]>='A'&&a[0]<='Z')
      {
          for(i=1;i<l;i++)
          {
             if(a[i]=='_'||a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'||a[i]>='0'&&a[i]<='9')
                continue;
             else
             {
                 flag=1;
                 break;
             }
          }
      }
      else
      {
          flag=1;
      }
      if(flag)
        printf("no\n");
      else
        printf("yes\n");
    }
    return 0;
}

I - 叠筐

找规律+模拟

#include<stdio.h>
#include<string.h>
char e[85][85];
char a,b;
int main()
{
    int n,T=0;
    while(~scanf("%d %c %c",&n,&a,&b))
    {
        if(T)puts("");
        if(n==1)
        {
            printf("%c\n",a);
            continue;
        }
        char x;
        int tmp=1;
        if(((n+1)/2)%2==0)
        {
            char c=a;
            a=b;
            b=c;
        }
        while(tmp<=(n+1)/2)
        {
            int m=n-tmp+1;
            if (tmp%2==1)x=a;
            else x=b;
            for(int i=tmp; i<=m; i++)
            {
                e[tmp][i]=x;
                e[m][i]=x;
                e[i][tmp]=x;
                e[i][m]=x;
            }
            tmp++;
        }
        e[1][1]=e[n][n]=e[1][n]=e[n][1]=' ';
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
                printf("%c",e[i][j]);
            puts("");
        }
        T++;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/chimchim04/article/details/83013122