Codeforces April Fools Contest 2017

来自FallDream的博客,未经允许,请勿转载,谢谢。

-----------------------------------------------------------

听学长说了这场比赛十分有意思,所以来玩玩。   学长真的强,啥都会,全程听正解然后码代码.....

A.Numbers Joke

只有一个样例,输入3输出27  机智的学长瞬间就在OEIS上找到了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<queue>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int s[]={4,22,27,58,85,94,121,166,202,265,274,319,346,355,378,382,391,438,454,483,517,526,535,562,576,588,627,634,636,645,648,654,663,666,690,706,728,729,762,778};

int main()
{
    int n=read();
    cout<<s[n-1];
    return 0;
}

B.Kids' Riddle

只给输入输出  input 11 output  2   input14output0    input61441output2    input571576output10    input2128506output3

我也不知道学长是怎么发现的,正解是转换成16进制,然后数圈圈(对,你没看错)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<queue>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int n,ans=0;
const int s[16]={1,0,0,0,1,0,1,0,2,1,1,2,0,1,0,0};
int main()
{
    int x=read();if(!x)return 0*puts("1");
    while(x)
    {
        int a=x%16;
        ans+=s[a];
        x/=16;
    }
    cout<<ans;
    return 0;
}

C.INTERCALC

当场就念了一首诗

DO YOU EXPECT ME TO FIND THIS OUT?

WHAT BASE AND/XOR LANGUAGE INCLUDES string?

DON'T BYTE OF MORE THAN YOU CAN CHEW

YOU CAN ONLY DISTORT THE LARGEST OF MATHEMATICS SO FAR

SAYING "ABRACADABRA" WITHOUT A MAGIC AND WON'T DO YOU ANY GOOD

THE LAST STACK RUPTURES. ALL DIE. OH, THE EMBARRASSMENT!

I HAVE NO ARRAY AND I MUST SCREAM

ELEMENTS MAY NOT BE STORED IN WEST HYPERSPACE

我们发现它是藏头的,其实表达的是

FIND/FIGURE OR/XOR OF/OFF LARGEST/LAWS AND/WAND LAST/NEXT ARRAY/FILE ELEMENTS/VARIABLES

find xor of largest and last array elements

所以找出最大的和最后一个异或一下输出

#include<cstdio>
#include<iostream>
using namespace std;
int n,x,mx=0;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>x,mx=max(mx,x);
    cout<<(x^mx);
    return 0;
}

D.Touchy-feely Plaindromes

根据样例和题目判断,最后的结论是根据盲文判断是否对称...

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int s[]={8,-1,-1,-1,6,9,4,-1,0,5};
char st[12313];

int main()
{
    scanf("%s",st+1);int n=strlen(st+1);
    for(int i=1,j=n;i<j;i++,j--)
        if(st[i]!=st[j]&&s[st[i]-'0']!=st[j]-'0') return 0*puts("No");
    if(n&1){if(st[n/2+1]!='3'&&st[n/2+1]!='7')return 0*puts("No");}
    puts("YES");
    return 0;
}

E.Twisted Circuit

第二列从上到下表示异或、或、与和异或,然后直接算

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<queue>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int s[15];

int main()
{
    int a=read(),b=read(),c=read(),d=read();
    cout<<(((a^b)&(c|d))^((b&c)|(a^d)));
    return 0;
}

F.Crunching Numbers Just for You

题意:有n个顾客有n个数,你要把给定的n<=10个数排序好。

但是排序完出现rejected的情况,这时候看最后一句话

Remember, this is a very important feature, and you have to make sure the customers appreciate it!

所以顾客不想那么快结束,你要卡卡时间就行了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<queue>
#include<algorithm>
#include<ctime>
#include<map>
#define ll long long
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int a[132123];


int main()
{
    int n=read();time_t start = clock();
    for(int i=1;i<=n;i++)a[i]=read();
    sort(a+1,a+n+1);
    while((double)(clock()-start)/CLOCKS_PER_SEC<1.9);
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}

F.给定一个表达式求值,输出一份BrainFuck语言写的可以算出答案的代码。

先算出答案,然后按照BrainFuck语言的一套理论,+表示计数器+1,-表示计数器-1,.(点)表示输出计数器的asc码对应的字符。所以+48之后随便输出呗。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

char st[1231000];
int op[1231231],num[12313],cnt=0;

int calc(int l,int r)
{
    int x=0;
    for(int i=l;i<=r;i++)
        x=x*10+st[i]-'0';
    return x;
}

void work(int&th,int x)
{
    int to=x+48;
    while(th>to)th--,printf("-");
    while(th<to)th++,printf("+");
    printf(".
");
}

int main()
{
    scanf("%s",st+1);int pre=0;
    for(int i=1;st[i];i++)
    {
        if(st[i]=='+'||st[i]=='-')
        {
            op[++cnt]=(st[i]=='+')?1:2;
            num[cnt]=calc(pre+1,i-1);
            pre=i;
        }
    }
    num[++cnt]=calc(pre+1,strlen(st+1));
    int x=num[1];
    for(int i=1;i<cnt;i++)
    {
        if(op[i]==1)x=x+num[i+1];
        else x=x-num[i+1];
    }
    int th=0;cnt=0;
    if(!x) {work(th,0);return 0;}
    while(x)
    {
        num[++cnt]=x%10;x/=10;
    }
    for(int i=cnt;i;i--)
        work(th,num[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/FallDream/p/codeforces_april_fool.html