Educational Codeforces Round 29

来源:互联网 发布:北京软件学院 编辑:程序博客网 时间:2024/06/16 21:01

太弱鸡了,所以只有4题。(C题最难,没有之一)

A. 给你一个数字x,问能不能补充几个前导零使得他变成回文数(可以补充0个前导零)

模拟题

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<vector>#define LiangJiaJun main#define pa pair<int,int>#define INF 1999122700using namespace std;string s;int l,n;int LiangJiaJun(){    cin>>s;    l=s.size();    for(int t=0;t<=l;t++){        n=s.size();        bool fe=0;        for(int i=0,j=n-1;i<=j;i++,j--)if(s[i]!=s[j]){fe=1;break;}        if(!fe)return puts("YES"),0;        s='0'+s;    }    puts("NO");    return 0;}

B.给你2*n个人,n-1艘大船,2艘小船,一艘小船必须载1人,一艘大船必须载2人,大船的不稳的系数为载的两个人的体重之差。小船都是稳定的,求问不稳的系数的总和最小是多少。(n<= 50 , | 体重 |<=1000)
枚举哪两个人要坐小船,剩下的人从小到大排序,两两相邻的坐一起

C.A和B猜拳,1,2,3分别代表锤子剪刀布。给两个九宫格a和b。共K次游戏,每次赢的得一分,输的不得分,平局都不得分,如果当前A出了i , B出 j ,那么下一局中A 会出a[i][j] , B 会出b[i][j] 求问K局之后,A,B 各多少分。
k<=10^18
找规律的题目,挺恶心的

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<vector>#define LiangJiaJun main#define pa pair<int,int>#define INF 1999122700using namespace std;long long k,s1=0,s2=0,ans1=0,ans2=0;int a,b,na,nb,be=-1;vector<pa>c;int mp1[4][4],mp2[4][4],td[4][4];int LiangJiaJun(){    td[1][2]=td[1][1]=td[2][3]=td[2][2]=td[3][1]=td[3][3]=0;    td[1][3]=td[2][1]=td[3][2]=1;    cin>>k>>a>>b;    for(int i=1;i<=3;i++)        for(int j=1;j<=3;j++)cin>>mp1[i][j];    for(int i=1;i<=3;i++)        for(int j=1;j<=3;j++)cin>>mp2[i][j];    c.push_back(make_pair(a,b));    for(int i=1;i<k;i++){        int x=c[c.size()-1].first,y=c[c.size()-1].second;        na=mp1[x][y];nb=mp2[x][y];        for(int j=0;j<c.size();j++)            if(na==c[j].first&&nb==c[j].second){                be=j;break;            }        if(be!=-1)break;        c.push_back(make_pair(na,nb));    }    if(be==-1){        for(int i=0;i<c.size();i++){            ans1+=td[c[i].first][c[i].second];            ans2+=td[c[i].second][c[i].first];        }        cout<<ans1<<" "<<ans2<<endl;        return 0;    }    int l=c.size()-be;    for(int i=0;i<be;i++){        k--;        ans1+=td[c[i].first][c[i].second];        ans2+=td[c[i].second][c[i].first];    }    for(int i=be;i<c.size();i++){        s1+=td[c[i].first][c[i].second];        s2+=td[c[i].second][c[i].first];    }    ans1+=s1*(k/l);    ans2+=s2*(k/l);    for(int i=be;i<be+(k%l);i++){        ans1+=td[c[i].first][c[i].second];        ans2+=td[c[i].second][c[i].first];    }    cout<<ans1<<" "<<ans2<<endl;    return 0;}

D.给一个序列,长度n,共有q次操作,每次操作三个数t,l,r。如果t==1,那么将下标∈[l,r]的所有数字向右移动一位,下标为r的那个数字移到l;如果t==2,将序列[l,r]翻转。m个询问,每次询问一个x,询问做完这些操作后下标为x 的位置上那个数是多少。
n,q <=2*10^5 ,m<=100
看见m的范围就知道直接暴力了。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<vector>#define LiangJiaJun main#define pa pair<int,int>#define INF 1999122700using namespace std;struct data{int p,l,r;}a[200004];int n,b[200004],x,q,m;int LiangJiaJun(){    scanf("%d%d%d",&n,&q,&m);    for(int i=1;i<=n;i++)scanf("%d",&b[i]);    for(int i=1;i<=q;i++)scanf("%d%d%d",&a[i].p,&a[i].l,&a[i].r);    for(int t=1;t<=m;t++){        scanf("%d",&x);        for(int i=q;i>=1;i--){            if(!(a[i].l<=x&&x<=a[i].r))continue;            if(a[i].p==1){                if(x==a[i].l)x=a[i].r;                else x--;            }            else x=a[i].r-x+a[i].l;        }        printf("%d ",b[x]);    }    puts("");    return 0;}