编程语言
首页 > 编程语言> > 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛(回顾补题)

南昌大学航天杯第二届程序设计竞赛校赛网络同步赛(回顾补题)

作者:互联网

这次比赛4/9,当时比完没有及时补题,现在补上

A ID and password

模拟

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    string s1;
    while(cin>>s1)
    {
        for(int i=0;i<s1.size();i++)
        {
            if(s1[i]>='A'&&s1[i]<='Z')
                s1[i]+=32,cout<<s1[i];
            else
            {
                if(s1[i]>='a'&&s1[i]<='z')
                    s1[i]-=32,cout<<s1[i];
                else
                    cout<<s1[i];
            }
        }
        cout<<endl;
    }
    return 0;
}

B 取石子

看似是博弈论,实际上可以使用递推,求出所有的必胜点和必败点,然后标记查询即可。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
bool vis[300];
void init()
{
    int sum1=2,sum2=4,sum3=6,sum4=10,sum5=12,sum6=18;
    vis[1]=vis[3]=vis[5]=vis[7]=vis[9]=true;
    for(int i=10;i<=200;i++)
    {
        bool flag=false;
        int sum=0,j=i;
        if(j>sum1)
        {
            j-=sum1;
            if(vis[j])
                sum++;     
        }
        j=i;
        if(j>sum2)
        {
            j-=sum2;
            if(vis[j])
                sum++;     
        }
        j=i;
        if(j>sum3)
        {
            j-=sum3;
            if(vis[j])
                sum++;     
        }
        j=i;
        if(j>sum4)
        {
            j-=sum4;
            if(vis[j])
                sum++;     
        }
        j=i;
        if(j>sum5)
        {
            j-=sum5;
            if(vis[j])
                sum++;     
        }
        j=i;
        if(j>sum6)
        {
            j-=sum6;
            if(vis[j])
                sum++;     
        }
        if(sum)
            vis[i]=true;
        else
            vis[i]=false;
    }
}
int main()
{
    int n1,n2;
    init();
    while(cin>>n1>>n2)
    {
        int sum1=n1+n2;
        if(vis[sum1])
            cout<<"win\n";
        else
            cout<<"lose\n";
         
    }
    return 0;
}

C 水题

找规律,当时怎么就没想到呢,可惜可惜

#include<bits/stdc++.h>
using namespace std; 
int num[1011];
int main() {
    int n;
    while(~scanf("%d",&n)) {
        num[1]=0;
        num[2]=1;
        num[3]=2;
        num[4]=4;
        for(int i=5;i<1006;i++)
            num[i]=num[i-1]+i/2;
        cout<<num[n]<<endl;
    }
    return 0;
}

D 小C的记事本

当时比赛的时候疯狂写挂,现在用STL,一遍AC。STL真香。使用一个字符串表示之前操作,一个表示现在操作完的字符串记录,输出即可。

#include<bits/stdc++.h>
using namespace std;
stack<string> p;
int main() {
    ios::sync_with_stdio(false);
    int q;
    while(cin>>q) {
        string now1;
        while(q--) {
            int t;
            cin>>t;
            if(t==1) {
                string temp;
                cin>>temp;
                p.push(now1);
                now1=now1+temp;
            }
            if(t==2) {
                int k;
                cin>>k;
                p.push(now1);
                int len1=now1.size();
                now1=now1.substr(0,len1-k);
            }
            if(t==3) {
                int k;
                cin>>k;
                cout<<now1[k-1]<<endl;
            }
            if(t==4) {
                now1=p.top();
                p.pop();
            }
        }
        while(!p.empty())
            p.pop();
    }
    return 0;
}

F 阿汤的疑惑

大数取模,模拟即可

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string N;
        long long M,sum=0,S=0;
        cin>>N>>M;
        for(int i=0;i<N.size();i++)
        {
            sum=S*10+N[i]-'0';
            S=sum%M;
        }
        long long sum1=0;
        for(int i=2;i<=sqrt(S);i++)
        {
            if(S%i==0)
            {
                while(S%i==0)
                    S/=i;
                sum1++;
            }
        }
        if(S!=1)
            sum1++;
        cout<<sum1<<endl;
    }
    return 0;
}

G 阿汤的数组

这个,我觉得是个背包,但是两个数组的元素个数是任意个就行,只需要满足平均数相同,然后DFS,超时。看了下AC代码普遍都是GCD,希望来位大佬能解释一下。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=40;
int num[MAXN];
int n;
int sum1=0;
int main() {
    int t;
    while(~scanf("%d",&t)) {
        while(t--) {
            sum1=0;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
                scanf("%d",&num[i]),sum1+=num[i];
            if(__gcd(sum1,n)!=1)
                puts("yes");
            else
                puts("no");
        }
    }
    return 0;
}

H 小q的数列

初看以为是个递推公式,类似斐波那契,实际上是个循环数列,第一个出现的数字和二进制数相关。其数值就是二进制表示中1的个数,第一个这个数出现的项数就是2^{n}-1

#include<bits/stdc++.h>
using namespace std;
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        long long n,n1;
        scanf("%lld",&n);
        if(n==0) {
            printf("0 0\n");
            continue;
        }
        int sum=0;
        while(n) {
            if(n%2==1)
                sum+=1;
            n/=2;
        }
        n1=pow(2,sum)-1;
        printf("%d %lld\n",sum,n1);
    }
    return 0;
}

I 小q的时钟

模拟没什么好讲的,贴代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    long long begin1,end1;
    while(cin>>begin1>>end1)
    {
        long long hh=0,mm=0,ss=0;
        long long time1=end1-begin1;
        hh=time1/3600;
        mm=(time1-hh*3600)/60;
        ss=(time1-hh*3600-mm*60);
        if(hh>=10)
            cout<<hh<<":";
        else
            cout<<"0"<<hh<<":";
        if(mm>=10)
            cout<<mm<<":";
        else
            cout<<"0"<<mm<<":";
        if(ss>=10)
            cout<<ss;
        else
            cout<<"0"<<ss;
        cout<<endl;
    }
    return 0;
}

 

Ls_attack 发布了51 篇原创文章 · 获赞 1 · 访问量 6905 私信 关注

标签:int,sum,long,vis,while,补题,南昌大学,校赛,include
来源: https://blog.csdn.net/Ls_attack/article/details/104068971