2017-光棍节-11-11,17级周赛题解

http://acm.nyist.me/OJ/contest_problemset.php?cid=1036

祝我们节日快乐☺!!!

A题

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        long long a=0,b=0,x;
        while(n--)
        {
            scanf("%lld",&x);
            if(x%2==1) a+=x;
            else  b+=x;
        }
        printf("%lld %lld\n",a,b);
    }
}




B题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1100];
int main()
{
    memset(a,0,sizeof(a));
    a[0]=1;
    a[1]=1;
    for(int i=2;i<=1000;i++)
    {
        if(!a[i])
            for(int j=i*2;j<=1000;j+=i)
            a[j]=1;
    }
    int n;
    while(~scanf("%d",&n)&&n)
    {
        if(!a[n])printf("YES\n");
            else printf("NO\n");
    }
}



C题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL a[1000];
int main()
{
    a[3]=a[2]=a[1]=1LL;
    LL n;
    while(~scanf("%lld",&n))
    {
        int i=1;
        while(a[i]!=n)
        {
            i++;
            if(i>=4)
                a[i]=a[i-1]+a[i-2]+a[i-3];
        }
        printf("%d\n",i);
    }
}




D题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
    char s[210];
    while(~scanf("%s",s))
    {
        int l=strlen(s);
        int x=0;
        for(int i=0;i<l-3;i++)
        {
            if((s[i]=='r'||s[i]=='R')&&(s[i+1]=='i'||s[i+1]=='I')&&(s[i+2]=='b'||s[i+2]=='B')&&(s[i+3]=='a'||s[i+3]=='A'))
                x++;
        }
        printf("%d\n",x);
    }
}




E题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
    int x,y,t;
    while(~scanf("%d%d%d",&x,&y,&t))
    {
        printf("%d\n",(3600*x-y)*t);
    }
}



//F题:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int a[100];
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i-1;j>=0;j--)
            {
                if(a[i]==a[j])
                    a[j]=0;
            }
        }
        for(int i=0;i<n-1;i++)
        {
            if(a[i]!=0)
                printf("%d ",a[i]);
        }
        printf("%d\n",a[n-1]);
    }
}



G题:找到每个数字的特点
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
char s[100];
int a[100];
char b[10][6];
int main()
{
    while(scanf("%s",s))
    {
        int ls=strlen(s);
        if(ls==1&&s[0]=='0') return 0;
        int la=0;
        for(int i=ls-1;i>=0;i--)
            a[la++]=s[i]-'0';
        for(int i=1;i<=7;i++)
            scanf("%s",b[i]+1);
        int x;
        if(b[4][1]=='#'&&b[4][2]=='.') x=0;
        if(b[1][1]=='.') x=1;
        if(b[5][1]=='#'&&b[2][1]=='.') x=2;
        if(b[2][1]=='.'&&b[5][1]=='.'&&b[4][1]=='#') x=3;
        if(b[7][1]=='.'&&b[4][1]=='#') x=4;
        if(b[2][5]=='.'&&b[5][1]=='.') x=5;
        if(b[2][5]=='.'&&b[5][1]=='#') x=6;
        if(b[4][1]=='.'&&b[1][1]=='#') x=7;
        if(b[2][1]=='#'&&b[4][2]=='#'&&b[5][1]=='#'&&b[2][5]=='#'&&b[5][5]=='#') x=8;
        if(b[2][1]=='#'&&b[2][5]=='#'&&b[7][1]=='#'&&b[5][1]=='.') x=9;
        a[0]+=x;
        int j=0;
        while(a[j]>=10)
        {
            a[j]%=10;
            a[++j]++;
        }
        if(a[la]) printf("%d",a[la]);
        for(int i=la-1;i>=0;i--)
            printf("%d",a[i]);
        printf("\n");
    }
}
或者下面的代码:
#include <bits/stdc++.h>
using namespace std;
string add(string s1,string s2)
{
    if(s1.length()<s2.length())
    {
        string temp=s1;
        s1=s2;
        s2=temp;
    }
    int i,j;
    for(i=s1.length()-1,j=s2.length()-1; i>=0; i--,j--)
    {
        s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
        if(s1[i]-'0'>=10)
        {
            s1[i]=char((s1[i]-'0')%10+'0');
            if(i) s1[i-1]++;
            else s1='1'+s1;
        }
    }
    return s1;
}
string str[10];
int main()
{
    string s1,s2;
    while(cin>>s1&&s1!="0")
    {
        for(int i=0; i<7; i++)
            cin>>str[i];
        int sum=0;
        for(int i=0; i<7; i++)
            for(int j=0; j<5; j++)
                if(str[i][j]=='#')
                    sum++;
        if(sum==7) s2="1";
        else if(sum==20) s2="0";
        else if(sum==23) s2="8";
        else if(sum==11) s2="7";
        else if(sum==14) s2="4";
        else if(sum==19)
        {
            if(str[1][4]=='#')
            {
                if(str[5][4]=='#') s2="3";
                else s2="2";
            }
            else s2="5";
        }
        else if(sum==21)
        {
            if(str[1][4]=='#') s2="9";
            else s2="6";
        }
        cout<<add(s1,s2)<<endl;
    }
    return 0;
}

H题:A+B
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int b[100],lb;
void fenjie(int x)//把数字分解,然后存进b数组中
{
    if(x<0) x=-x;//去掉符号
    int k[15];
    int lk=0;
    if(x==0) k[lk++]=0;//如果数字为0要存入0!!!!!
    while(x)//倒叙
    {
        k[lk++]=x%10;
        x/=10;
    }
    for(int i=lk-1; i>=0; i--)
        b[lb++]=k[i];//再到着存入b中
    return ;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        lb=0;
        int A,B,C;
        scanf("%d%d",&A,&B);
        C=A+B;
        if(A<0) b[lb++]=11;//控制A的符号
        fenjie(A);
        if(B<0) b[lb++]=11;//控制B的符号,不是负号就是正号。
        else b[lb++]=10;//10表示'+',11表示'-',12表示'=';
        fenjie(B);
        b[lb++]=12;//输出等号
        if(C<0) b[lb++]=11;//控制C的符号
        fenjie(C);
        //b数组中存输出顺序
        for(int i=0;i<7;i++)
        {
            for(int j=0;j<lb;j++)
            {
                if(j) printf(".");
                if(b[j]==0)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("#...#");
                    if(i==2) printf("#...#");
                    if(i==3) printf("#...#");
                    if(i==4) printf("#...#");
                    if(i==5) printf("#...#");
                    if(i==6) printf("#####");
                }
                if(b[j]==1)
                {
                    if(i==0) printf("....#");
                    if(i==1) printf("....#");
                    if(i==2) printf("....#");
                    if(i==3) printf("....#");
                    if(i==4) printf("....#");
                    if(i==5) printf("....#");
                    if(i==6) printf("....#");
                }
                if(b[j]==2)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("....#");
                    if(i==2) printf("....#");
                    if(i==3) printf("#####");
                    if(i==4) printf("#....");
                    if(i==5) printf("#....");
                    if(i==6) printf("#####");
                }
                if(b[j]==3)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("....#");
                    if(i==2) printf("....#");
                    if(i==3) printf("#####");
                    if(i==4) printf("....#");
                    if(i==5) printf("....#");
                    if(i==6) printf("#####");
                }
                if(b[j]==4)
                {
                    if(i==0) printf("#...#");
                    if(i==1) printf("#...#");
                    if(i==2) printf("#...#");
                    if(i==3) printf("#####");
                    if(i==4) printf("....#");
                    if(i==5) printf("....#");
                    if(i==6) printf("....#");
                }
                if(b[j]==5)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("#....");
                    if(i==2) printf("#....");
                    if(i==3) printf("#####");
                    if(i==4) printf("....#");
                    if(i==5) printf("....#");
                    if(i==6) printf("#####");
                }
                if(b[j]==6)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("#....");
                    if(i==2) printf("#....");
                    if(i==3) printf("#####");
                    if(i==4) printf("#...#");
                    if(i==5) printf("#...#");
                    if(i==6) printf("#####");
                }
                if(b[j]==7)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("....#");
                    if(i==2) printf("....#");
                    if(i==3) printf("....#");
                    if(i==4) printf("....#");
                    if(i==5) printf("....#");
                    if(i==6) printf("....#");
                }
                if(b[j]==8)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("#...#");
                    if(i==2) printf("#...#");
                    if(i==3) printf("#####");
                    if(i==4) printf("#...#");
                    if(i==5) printf("#...#");
                    if(i==6) printf("#####");
                }
                if(b[j]==9)
                {
                    if(i==0) printf("#####");
                    if(i==1) printf("#...#");
                    if(i==2) printf("#...#");
                    if(i==3) printf("#####");
                    if(i==4) printf("....#");
                    if(i==5) printf("....#");
                    if(i==6) printf("#####");
                }
                if(b[j]==10)
                {
                    if(i==0) printf(".....");
                    if(i==1) printf("..#..");
                    if(i==2) printf("..#..");
                    if(i==3) printf("#####");
                    if(i==4) printf("..#..");
                    if(i==5) printf("..#..");
                    if(i==6) printf(".....");
                }
                if(b[j]==11)
                {
                    if(i==0) printf(".....");
                    if(i==1) printf(".....");
                    if(i==2) printf(".....");
                    if(i==3) printf("#####");
                    if(i==4) printf(".....");
                    if(i==5) printf(".....");
                    if(i==6) printf(".....");
                }
                if(b[j]==12)
                {
                    if(i==0) printf(".....");
                    if(i==1) printf(".....");
                    if(i==2) printf("#####");
                    if(i==3) printf(".....");
                    if(i==4) printf("#####");
                    if(i==5) printf(".....");
                    if(i==6) printf(".....");
                }
            }
            printf("\n");
        }
        if(t) printf("\n");
    }
}
或者是下面的代码
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
struct node
{
    string s[10];//用结构体有结构体的好处,主要是能把数字存下来
} a[15];//用结构体更清晰,不想用字符串和结构体的也可以开三维的char数组。
//每一个a[i]代表i这个数字,10代表'+',11代表'-',12代表'=';
void init()
{
    a[0].s[1]="#####";
    a[0].s[2]="#...#";
    a[0].s[3]="#...#";
    a[0].s[4]="#...#";
    a[0].s[5]="#...#";
    a[0].s[6]="#...#";
    a[0].s[7]="#####";


    a[1].s[1]="....#";
    a[1].s[2]="....#";
    a[1].s[3]="....#";
    a[1].s[4]="....#";
    a[1].s[5]="....#";
    a[1].s[6]="....#";
    a[1].s[7]="....#";


    a[2].s[1]="#####";
    a[2].s[2]="....#";
    a[2].s[3]="....#";
    a[2].s[4]="#####";
    a[2].s[5]="#....";
    a[2].s[6]="#....";
    a[2].s[7]="#####";


    a[3].s[1]="#####";
    a[3].s[2]="....#";
    a[3].s[3]="....#";
    a[3].s[4]="#####";
    a[3].s[5]="....#";
    a[3].s[6]="....#";
    a[3].s[7]="#####";


    a[4].s[1]="#...#";
    a[4].s[2]="#...#";
    a[4].s[3]="#...#";
    a[4].s[4]="#####";
    a[4].s[5]="....#";
    a[4].s[6]="....#";
    a[4].s[7]="....#";


    a[5].s[1]="#####";
    a[5].s[2]="#....";
    a[5].s[3]="#....";
    a[5].s[4]="#####";
    a[5].s[5]="....#";
    a[5].s[6]="....#";
    a[5].s[7]="#####";


    a[6].s[1]="#####";
    a[6].s[2]="#....";
    a[6].s[3]="#....";
    a[6].s[4]="#####";
    a[6].s[5]="#...#";
    a[6].s[6]="#...#";
    a[6].s[7]="#####";


    a[7].s[1]="#####";
    a[7].s[2]="....#";
    a[7].s[3]="....#";
    a[7].s[4]="....#";
    a[7].s[5]="....#";
    a[7].s[6]="....#";
    a[7].s[7]="....#";


    a[8].s[1]="#####";
    a[8].s[2]="#...#";
    a[8].s[3]="#...#";
    a[8].s[4]="#####";
    a[8].s[5]="#...#";
    a[8].s[6]="#...#";
    a[8].s[7]="#####";


    a[9].s[1]="#####";
    a[9].s[2]="#...#";
    a[9].s[3]="#...#";
    a[9].s[4]="#####";
    a[9].s[5]="....#";
    a[9].s[6]="....#";
    a[9].s[7]="#####";


    a[10].s[1]=".....";
    a[10].s[2]="..#..";
    a[10].s[3]="..#..";
    a[10].s[4]="#####";
    a[10].s[5]="..#..";
    a[10].s[6]="..#..";
    a[10].s[7]=".....";


    a[11].s[1]=".....";
    a[11].s[2]=".....";
    a[11].s[3]=".....";
    a[11].s[4]="#####";
    a[11].s[5]=".....";
    a[11].s[6]=".....";
    a[11].s[7]=".....";


    a[12].s[1]=".....";
    a[12].s[2]=".....";
    a[12].s[3]="#####";
    a[12].s[4]=".....";
    a[12].s[5]="#####";
    a[12].s[6]=".....";
    a[12].s[7]=".....";
}
int b[300],lb;
void fenjie(int Q)//把数字分解,然后存进b数组中
{
    if(Q<0) Q=-Q;//去掉符号
    int k[15];
    int lk=0;
    if(Q==0) k[lk++]=0;//如果数字为0要存入0。
    while(Q)//倒叙
    {
        k[lk++]=Q%10;
        Q/=10;
    }
    for(int i=lk-1; i>=0; i--)
        b[lb++]=k[i];//再到着存入b中
    return ;
}
int main()
{
    init();// 10表示'+',11表示'-',12表示'=';
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int x,y,z;
        scanf("%d%d",&x,&y);
        z=x+y;
        lb=0;
        if(x<0) b[lb++]=11;//控制x的符号
        fenjie(x);
        if(y<0) b[lb++]=11;//控制y的符号,不是负号就是正号。
        else b[lb++]=10;
        fenjie(y);
        b[lb++]=12;//输出等号
        if(z<0) b[lb++]=11;//控制z的符号
        fenjie(z);
        //b数组中存输出顺序
        for(int i=1; i<=7; i++)//输出第一行到第七行
        {
            for(int j=0; j<lb; j++)//每一行按数组b的顺序输出
            {
                if(j) cout<<".";//中间用'.'隔开
                cout<<a[b[j]].s[i];//用字符串或者char数组输出都行
            }
            printf("\n");
        }
        if(t) printf("\n");//控制格式
    }
}





I题:快速幂的变形
并不是所有问题都是盲目套模板的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
#define mod 10000000000
using namespace std;
//举个栗子:(a)6541341165*(b)9846541356
//将b拆开拆成,9,8,4,6,5,4,1,2,5,6
//然后把a*b变成:a*6+a*10%mod*5+a*10%mod*10%mod*2+a*10%mod*10%mod*10%mod*1+.....以此类推
//这样就能解决a*b会爆LL的问题了。
LL chengfa(LL a,LL b)
{
    LL sum=0;
    while(b)
    {
        sum=(sum+a*(b%10))%mod;
        a=a*10%mod;
        b=b/10;
    }
    return sum;
}
//LL chengfa(LL a,LL b)//如果mod为1e18的话就必须这样写了,用二进制解决这个问题
//{
//    LL sum=0;
//    while(b)
//    {
//        if(b%2==1) sum=(sum+a)%mod;
//        a=(a+a)%mod;
//        b=b/2;
//    }
//    return sum;
//}//看懂后你会发现这个代码和快速幂的代码基本上一样。*和+的区别。
LL pow(LL a,LL b)
{
    LL sum=1;
    while(b)
    {
        if(b%2==1) sum=chengfa(sum,a);
        a=chengfa(a,a);
//这里的a是一个小于mod的数字,a可能是一个十位数的数字
//两个十位数相乘是二十位的数字,那么就超过了LL
//所以要想办法使得a*a不超过LL,具体看chengfa()函数。
        b=b/2;
    }
    return sum;
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%010lld\n",pow((LL)a,(LL)b));
    }
    return 0;
}



CTX学长的找位置游戏
这个问题叫做错排问题,
错排公式是f[n]=(n-1)*(f[n-1]+f[n-2]);
题上给出了第1,2,3,5,6项的值,需要你手推第四项,然后找规律。
#include<cstdio>
int a[100100];
int main()
{
    a[1]=0;
    a[2]=1;
    a[3]=2;
    for(int i=4;i<=100000;i++)
        a[i]=(i-1)*(a[i-1]+a[i-2])%10007;
    int t,x;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&x);
        printf("%d\n",a[x]);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值