【codeforces】Round #269 ABCD

来源:互联网 发布:北京unity3d培训2ds 编辑:程序博客网 时间:2024/05/30 04:20

A:判断熊象,六个参数,有4个是腿,必须一样,另外两个如果相同是象,不同是熊,不符合要求是喵星人!

B:给出几个数,将他们以不下降的方式排一下,若有三种及其以上排法,输出YES,然后任意输出三种排法(序号),有SPJ。

C:有n张牌,搭建房子,问有多少种可以搭出来的层数。

来张图吧!表示怎么搭,看不懂?GO HITTING ME!(来打我吖?


我来一个20以内的表:01001,01101,10111,11111,没有能摆出2的,不要问我为什么。

D:给一个大墙(高度略参差不齐),然后再给一面小墙,往上拼接!

比如下图,答案就是2,同样不要问我为什么,看代码吧。


E:没读题。

题解:

A,B:略、

C:枚举每一层,看能不能得到,我代码里for每次循环都是一层,fr表示当前层数。

D:预处理+KMP。快速水过,代码写渣了,只需要对m==1特判一下,其它就是正常的裸KMP,来一发就过了。

E:233。


代码:按顺序是ABCD,大不了你去找样例跑一遍就知道哪题是哪题了。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int f[10],num[10];int main(){//  freopen("test.in","r",stdin);    int i,j,k,flag=0;    for(i=1;i<=6;i++)scanf("%d",&f[i]);    sort(f+1,f+7);    for(i=1;i<=6;i++)    {        if(f[i]==f[i-1])        {            num[i]=num[i-1];        }        num[i]++;        if(num[i]==4)        {            flag=1;            for(j=0;j<4;j++)            {                f[i-j]=0;            }        }    }    if(!flag)    {        printf("Alien\n");        return 0;    }    else    {        sort(f+1,f+7);        if(f[5]==f[6])        {            puts("Elephant");        }        else puts("Bear");    }    return 0;}

#include <cstdio>#include <cstring>#include <algorithm>#define N 2005using namespace std;struct KSD{    int x,f;    bool operator < (const KSD& a)const    {        return x<a.x;    }}s[N];struct Syndra{    int v,next;}e[N];int head[N],cnt,num[N],visit[N];int n,ans,m;void add(int u,int v){    cnt++;    e[cnt].v=v;    e[cnt].next=head[u];    head[u]=cnt;}int pre[N];int ppp[N],star;void print(int x,int p){    int flag=0;    if(x>m)    {        ans++;        for(star=n;p;p=pre[p])ppp[star--]=s[p].f;        for(star=1;star<=n;star++)printf("%d ",ppp[star]);        puts("");        if(ans==3)exit(0);        return ;    }    int i,v;    for(i=head[x];i;i=e[i].next)    {        v=e[i].v;        if(!visit[v])        {            flag=1;            visit[v]=1;            pre[v]=p;            print(x,v);            visit[v]=0;        }    }    if(!flag)print(x+1,p);}int main(){    int i,j,k,flag=0;    scanf("%d",&n);    for(i=1;i<=n;i++)scanf("%d",&s[i].x),s[i].f=i;    sort(s+1,s+n+1);    for(i=1;i<=n;i++)    {        if(s[i].x!=s[i-1].x)num[++m]=1;        else num[m]++;        if(num[m]>=3)flag+=2;        if(num[m]==2)flag++;        add(m,i);    }    if(flag<2)    {        puts("NO");        return 0;    }    else    {        puts("YES");        print(1,0);    }    return 0;}

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;long long n,sum,now,ans,fr;int main(){    long long i,j,k;    cin>>n;    for(sum=now=2;sum<=n;now+=3,sum+=now)    {        fr++;        if((n+fr)%3==0)ans++;    }    cout<<ans;    return 0;}

#include <cstdio>#include <cstring>#include <algorithm>#define N 201000using namespace std;int fix,a[N],pre[N],n,m,s[N],ans;int main(){//  freopen("test.in","r",stdin);    int i,j,k,x,y;    scanf("%d%d",&n,&m);    if (m == 1) {        printf("%d\n", n);        return 0;    }    if (n < m) {        printf("0");        return 0;    }    scanf("%d",&x);    for(i=1;i<n;i++)    {        scanf("%d",&y);        a[i]=y-x;x=y;    }n--;    scanf("%d",&x);    for(i=1;i<m;i++)    {        scanf("%d",&y);        s[i]=y-x;x=y;    }m--;    s[m + 1] = 1 << 30;    for(fix=0,i=2;i<=m;i++)    {        while(fix&&s[fix+1]!=s[i])fix=pre[fix];        if(s[fix+1]==s[i])fix++;        pre[i]=fix;    }    for(fix=0,i=1;i<=n;i++)    {        while(fix&&s[fix+1]!=a[i])fix=pre[fix];        if(s[fix+1]==a[i])fix++;        if(fix==m)ans++;    }    printf("%d\n",ans);    return 0;}



好吧,其实我是来贴代码的,题解神马的根本就没好好写。

不爽?来打我吖?!!


0 0
原创粉丝点击