【codeforces】Round #269 ABCD

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

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

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

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

【codeforces】Round #269 ABCD_第1张图片

我来一个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 2005
using 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 201000
using 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;
}



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

不爽?来打我吖?!!


你可能感兴趣的:(round,codeforces,D,E,269)