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

比赛链接:
https://cn.vjudge.net/contest/191248
密码:nyist

弱校新生题解,大牛速速离去~


A - Thickest Burger

输出A*2+ B和A+B*2 较大的一个

#include
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
    int t,a,b;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        printf("%d\n",max(a*2+b,a+b*2));
    }
    return 0;
}

B - Relative atomic mass

直接计算即可

#include
#include
using namespace std;
char s[20];
int main()
{
    int t,a,b;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int len=strlen(s);
        int sum=0;
        for(int i=0; iif(s[i]=='C')
                sum+=12;
            if(s[i]=='H')
                sum+=1;
            if(s[i]=='O')
                sum+=16;
        }
        printf("%d\n",sum);
    }
    return 0;
}

C - 分拆素数和

写一个判断素数的函数,直接暴力即可

#include
#include
int prime(int x)
{
    int i,flag=1;
    for(i=2; i<=sqrt(x); i++)
    {
        if(x%i==0)
            flag=0;
    }
    return flag;
}
int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=0&&n)
    {
        j=0;
        for(i=2; i2; i++)
        {
            if(prime(i)&&prime(n-i))
                j++;
        }
        printf("%d\n",j);
    }
    return 0;
}

D - 小明A+B

对于要计算的数,直接对100取模即可

#include
int main()
{
    int a,b,c,d,n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d",&a,&b);
        c=a%100;
        d=b%100;
        printf("%d\n",(c+d)%100);
    }
}

E - 整数解

通过枚举,可以暴力水过

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

F - 找单词

我们把题目转化成多重背包的思路来理解。

先看一下多重背包的一般定义:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

在这个题目里面就是:
有26个物品,背包的容量为50,每一件物品的数量题目已经给出,现在就剩下每一个物品的重量,我们可以直接用字母的标号1-26代替.

先定义状态:dp[i][j]表示有i个字母,总价值为j的时候,符合条件的单词数量
我们可以得到状态转移方程:

dp[i][j]+=dp[i1][jkw[i]]

#include 
#include 
int dp[55][55];
int w[30],num[30];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        memset(w,0,sizeof(w));
        for(int i=1; i<=26; i++)
        {
            w[i]=i;
            scanf("%d",&num[i]);
        }
        dp[0][0]=1;
        for(int i=1; i<=26; i++)
            for(int j=0; j<=50; j++)
                for(int k=0; k<=num[i]&&k*w[i]<=j; k++)//k代表字母的数量,w[i]代表不同的字母
                    dp[i][j]+=dp[i-1][j-k*w[i]];
        int ans=0;
        for(int i=1; i<=50; i++)
            ans+=dp[26][i];
        printf("%d\n",ans);
    }
    return 0;
}

G - 夹角有多大II

回顾一下我们学过的向量的知识,利用两条边来计算夹角

cosC=x1x2+y1y2x21+y21x22+y22

#include 
#include 
#define PI 3.1415926535;
int main()
{
    double x1,x2,y1,y2;
    int T;
    double a,b,c;
    while(scanf("%d",&T)!=EOF)
    {
        while(T--)
        {
            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;
}

H - 手机短号

加深一下对字符串的理解,字符串可以如何输出

#include
int main()
{
    int n,i;
    char a[12];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",a);
        printf("6%s\n",a+6);
    }
}

I - C语言合法标识符

考察一下什么是c语言合法标识符

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

J - 叠筐

模拟题,每个人的答案可能不一样,代码仅供参考
这种题一般就是看图找规律+模拟

#include
#include
char e[85][85];
char op1[2],op2[2];
int main()
{
    int n,T=0;
    while(~scanf("%d %s %s",&n,op1,op2))
    {
        if(T)puts("");
        if(n==1)
        {
            printf("%c\n",op1[0]);
            continue;
        }
        char x,a=op1[0],b=op2[0];
        int tmp=1;
        if(((n+1)/2)%2==1)
        {
            char c=a;
            a=b;
            b=c;
        }
        while(tmp<=(n+1)/2)
        {
            int m=n-tmp+1;
            if (tmp%2==1)x=b;
            else x=a;
            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;
}

你可能感兴趣的:(【比赛补题/比赛代码】)