Codeforces Round #269 (Div. 2) A,B,C,D

来源:互联网 发布:plc编程介绍 编辑:程序博客网 时间:2024/06/06 03:33

CodeForces - 471A

首先要有四个数相等,然后剩下两个数不同就是Bear,否则就是Elephant。

#include <bits/stdc++.h>using namespace std;typedef pair<int,int> PII;int num[10];int a;int main(){    memset(num,0,sizeof(num));    for(int i=1;i<=6;i++)    {        scanf("%d",&a);        num[a]++;    }    bool flag=false;    for(int i=1;i<=9;i++){        if(num[i]>=4){            num[i]-=4;            flag=true;            break;        }    }    if(flag){        for(int i=1;i<=9;i++){            if(num[i]==2){                puts("Elephant");                return 0;            }        }        puts("Bear");    }    else{        puts("Alien");    }    return 0;}

CodeForces - 471B

先要判断满足,然后sort完本身是一种,然后交换一次又是一种,标记掉,再交换,就有三种了。

#include <bits/stdc++.h>using namespace std;typedef pair<int,int> PII;int tp;int num[2010];int n;struct asd{    int id;    int w;};asd a[2010];bool cmp(asd x,asd y){    if(x.w==y.w) return x.id<y.id;    return x.w<y.w;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i].w);        num[a[i].w]++;        a[i].id=i;    }    sort(a+1,a+n+1,cmp);    int sum=1;    for(int i=1;i<=2000;i++){        if(num[i]){            sum*=num[i];            if(sum>=3){                    puts("YES");                    for(int i=1;i<=n;i++)                        printf("%d ",a[i].id);                    puts("");                    for(int i=1;i<=n;i++){                        if(i+1<=n){                            if(a[i].w==a[i+1].w){                                printf("%d %d ",a[i+1].id,a[i].id);                                tp=i;                                i++;                            }                            else                                printf("%d ",a[i].id);                        }                        else                            printf("%d ",a[i].id);                    }                    puts("");                    for(int i=1;i<=n;i++){                        if(i+1<=n){                            if(a[i].w==a[i+1].w&&i!=tp){                                printf("%d %d ",a[i+1].id,a[i].id);                                i++;                            }                            else                                printf("%d ",a[i].id);                        }                        else                            printf("%d ",a[i].id);                    }                    return 0;            }        }    }    puts("NO");    return 0;}

CodeForces - 471C

#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef pair<int,int> PII;int main(){    LL n;    int k=0;    scanf("%lld",&n);    for(LL i=3-n%3;; i+=3)    {        if((2*(n+i))<(3*i*(i+1))) break;        k++;    }    printf("%d\n",k);    return 0;}

CodeForces - 471D

思路:

先特判掉m=1的时候,因为只要满足变化规律匹配就OK,所以相邻做个差,得到两个新串,然后就是求b串在a串里出现的次数(注意这个次数aa在aaa中出现2次),KMP即可;

#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef pair<int,int> PII;const int N=2e5+10;int n,m;int a[N],b[N];int a_num,b_num;int Next[N];void GetNext(){    int i=0,j=-1;    Next[0]=-1;    while(i<b_num){        if(j==-1||b[i]==b[j])            Next[++i]=++j;        else            j=Next[j];    }}int KMP(){    GetNext();    int ans=0;    int i=0,j=0;    while(i<a_num){        if(j==-1||a[i]==b[j])        {            i++;            j++;            if(j==b_num){                j=Next[j];                ans++;            }        }        else            j=Next[j];    }    return ans;}int main(){    int pre,x;    scanf("%d%d",&n,&m);    if(m==1){        printf("%d\n",n);        return 0;    }    a_num=b_num=0;    scanf("%d",&pre);    for(int i=2;i<=n;i++){        scanf("%d",&x);        a[a_num++]=x-pre;        pre=x;    }    scanf("%d",&pre);    for(int i=2;i<=m;i++){        scanf("%d",&x);        b[b_num++]=x-pre;        pre=x;    }    printf("%d\n",KMP());    return 0;}




0 0
原创粉丝点击