2021CCPC第十六届华讯杯内蒙古大学生程序设计竞赛题解

Posted Mr_渣渣辉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021CCPC第十六届华讯杯内蒙古大学生程序设计竞赛题解相关的知识,希望对你有一定的参考价值。

A题 BGO

在这里插入图片描述

/**A*/
#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        double p;
        cin>>p;
        double w=p,e=p,m=1,cnt=1;
        while(m!=0){
            cnt++;
            m*=(1-w);
            w=min(w+p,1.0);
            e+=w*m*cnt;
        }
        printf("%.6lf\\n",(double)1/e);
    }
    return 0;
}

B题 小Y的游戏

在这里插入图片描述

/**B*/
#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int a,b,c;
        cin>>a>>b>>c;
        bool flag=1;
        if(a*b*c==163)flag=0;
        if(a*b+c==163)flag=0;
        if(a*b-c==163)flag=0;
        if(a+b*c==163)flag=0;
        if(a-b*c==163)flag=0;
        if(!flag)
            cout<<1<<endl;
        else
            cout<<0<<endl;
    }
    return 0;
}

C题 灭霸打响指

在这里插入图片描述

/**C*/
#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        double sum=0;
        for(int i=0;i<n;i++){
            double num;
            cin>>num;
            sum+=num;
        }
        printf("%.2lf\\n",sum*0.5);
    }
    return 0;
}

D题 将军旗

在这里插入图片描述

/**D*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e2*4+5;
void cnt(int n,int m,int amaze[][maxn],int bmaze[][maxn],int *acnt,int *bcnt){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            *acnt+=amaze[i][j];
            *bcnt+=bmaze[i][j];
        }
}
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        int ax,ay,bx,by;
        int amaze[maxn][maxn],bmaze[maxn][maxn];
        memset(amaze,0,sizeof(amaze));
        memset(bmaze,0,sizeof(bmaze));
        cin>>ax>>ay;
        cin>>amaze[ax][ay];
        cin>>bx>>by;
        cin>>bmaze[bx][by];
        int acnt=0,bcnt=0;
        int flag=0;
        int q;
        cin>>q;
        for(int i=0;i<q;i++){
            int x,y;
            int num;
            char c;
            cin>>x>>y>>c;
            amaze[ax][ay]++;
            num=amaze[x][y]-1;
            amaze[x][y]=1;
            if(c=='U')x--;
            if(c=='D')x++;
            if(c=='L')y--;
            if(c=='R')y++;
            num+=amaze[x][y];
            if(num>bmaze[x][y]){
                amaze[x][y]=num-bmaze[x][y];
                bmaze[x][y]=0;
            }else{
                amaze[x][y]=0;
                bmaze[x][y]-=num;
            }
            if(bmaze[bx][by]==0&&!flag){
                flag=1;
                cnt(n,m,amaze,bmaze,&acnt,&bcnt);
            }
            cin>>x>>y>>c;
            bmaze[bx][by]++;
            num=bmaze[x][y]-1;
            bmaze[x][y]=1;
            if(c=='U')x--;
            if(c=='D')x++;
            if(c=='L')y--;
            if(c=='R')y++;
            num+=bmaze[x][y];
            if(num>amaze[x][y]){
                bmaze[x][y]=num-amaze[x][y];
                amaze[x][y]=0;
            }else{
                bmaze[x][y]=0;
                amaze[x][y]-=num;
            }
            if(amaze[ax][ay]==0&&!flag){
                flag=2;
                cnt(n,m,amaze,bmaze,&acnt,&bcnt);
            }
        }
        if(flag==0){
            cout<<"draw!"<<endl;
            cnt(n,m,amaze,bmaze,&acnt,&bcnt);
        }else if(flag==1)
            cout<<"Alice wins!!!"<<endl;
        else
            cout<<"Bob wins!!"<<endl;
        cout<<acnt<<' '<<bcnt<<endl;
    }
    return 0;
}

E题 小手冰凉和oja的新游戏

在这里插入图片描述

/**E*/
#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        string s[107];
        int n,k=0;
        cin>>n;
        for(int i=0;i<n;i++){
            int m;
            cin>>m;
            string t="";
            for(int j=0;j<m;j++){
                int num;
                cin>>num;
                t+=(char)(num+'0');
            }
            bool flag=1;
            for(int j=0;j<k;j++){
                if(s[j].find(t)!=-1){
                    flag=0;
                    break;
                }
                if(t.find(s[j])!=-1){
                    flag=0;
                    s[j]=t;
                    break;
                }
            }
            if(flag){
                s[k++]=t;
            }
        }
        bool flag=1;
        for(int i=0;i<k;i++){
            if(s[i].length()%2==0){
                flag=0;
                break;
            }
        }
        if(flag)
            cout<<"Xsblwins!"<<endl;
        else
            cout<<"Ojawins!"<<endl;
    }
    return 0;
}

F题 小Y的数列

在这里插入图片描述

/**F*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3*2+5;;
const int mod=1e4+7;
int str[maxn][maxn];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m;
        memset(str,0,sizeof(str));
        cin>>n>>m;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                if(i==0)
                    str[i][j]=1;
                else{
                    if(j==0)
                        str[i][j]=1;
                    else
                        str[i][j]=(str[i][j-1]+str[i-1][j])%mod;
                }
            }
        cout<<str[n-1][m-1]<<endl;
    }
    return 0;
}

G题 弹珠卡牌

在这里插入图片描述

/**G*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int ball[maxn];
int card[maxn];
int main(){
    int tt;
    cin>>tt;
    while(tt--){
        memset(card,0,sizeof(card));
        memset(ball,0,sizeof(ball));
        int n,p,t;
        cin>>n>>p>>t;
        int bp=t;
        for(int i=0;i<n;i++)
            cin>>ball[i];
        int m;
        cin>>m;
        for(int i=0;i<m;i++){
            int num,sum;
            cin>>num>>sum;
            card[num]=card[num]==0?sum:min(sum,card[num]);
        }
        int allneed=0;
        for(int i=0;i<=p;i++)
            allneed+=card[i];
        int cnt=0;
        while(allneed){
            bool flag=1;
            for(int i=0;i<t;i++){
                if(card[ball[i]]!=0){
                    cnt++;
                    flag=0;
                    card[ball[i]]--;
                    allneed--;
                    if(bp<n){
                        ball[i]=ball[bp++];
                    }else
                        ball[i]=p+1;
                }
            }
            if(flag){
                if(bp<n){
                    cnt++;
                    ball[0]=ball[bp++];
                    if(card[0]!=0){
                        card[0]--;
                        allneed--;
                    }
                }else{
                    if(t>0&&card[0]!=0){
                        card[0]--;
                        allneed--;
                        t--;
                        cnt++;
                    }else
                        break;
                }
            }
        }
        if(allneed==0)
            cout<<cnt<<endl;
        else
            cout<<-1<<endl;
    }
    return 0;
}

H题 回文串文回

在这里插入图片描述

/**H*/
#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        int maxlen=0;
        for(int i=0;i<s.length();i++){
            for(int j=s.length()-1;j>i+1+maxlen;j--){
                int p=0;
                while(i+p+1<j-p&&s[i+p]==s[j-p])
                    p++;
                maxlen=max(p*2,maxlen);
            }
        }
        cout<<maxlen<<endl;
    }
    return 0;
}

I题 超级无敌动态树模板

在这里插入图片描述

/**I*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4以上是关于2021CCPC第十六届华讯杯内蒙古大学生程序设计竞赛题解的主要内容,如果未能解决你的问题,请参考以下文章

2021CCPC第十六届华讯杯内蒙古大学生程序设计竞赛题解

2021CCPC第十六届华讯杯内蒙古大学生程序设计竞赛题解

第十六届全国大学生智能汽车竞赛航天智慧物流总决赛暨第二届“航天杯”移动机器人AI创新技术挑战赛圆满举办

第十六届全国大学生智能车竞赛文化衫LOGO主图案设计

第十六届全国大学生智能车竞赛-赛前开题

第十六届全国大学生智能汽车竞赛 讯飞智慧餐厅组别 全国选拔赛成绩公布说明