April Fools Day Contest 2016 题解

A.Da Vinci Powers

已知a,求2^a
注意达芬奇算错了2的幂次

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
ll t[100]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8092, 16184, 32368, 64736, 129472, 258944, 517888, 1035776, 2071552, 4143104, 8286208, 16572416, 33144832, 66289664, 132579328, 265158656, 530317312, 1060634624, 2121269248, 4242538496, 8485076992, 16970153984, 33940307968};
int main()
{
//  freopen("A.in","r",stdin);
//  freopen(".out","w",stdout);
    int a;
    while(cin>>a) 
    {
        cout<<t[a]<<endl; 
    }


    return 0;
}

B.Scrambled
题面的单词被全部错排。。。
题意:已知 Mi,Ri ,对于所有的非负数D,计算至少存在一个i,使 DRi(modMi)

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int n;
int m[20],r[20];
ll gcd(ll a,ll b){if (!b) return a;return gcd(b,a%b);}
int main()
{
//  freopen("B.in","r",stdin);
//  freopen(".out","w",stdout);

    int p=1;
    For(i,16) p=p*i/gcd(p,i);

    int n=read();
    For(i,n) cin>>m[i];
    For(i,n) cin>>r[i];

    int ans=0; 
    Rep(i,p) 
    {
        For(j,n) {
            if (i%m[j]==r[j]) {
                ++ans;break;
            } 
        }
    } 
    printf("%.6lf\n",ans/(double)p);


    return 0;
}

c.Without Text

给你一个长度<=50的字符串,请从下图猜出要输出的内容
Without Text
虽然有Split Text这种不知道在干嘛的东西,但是结合后面基本能猜出程序功能

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int main()
{
//  freopen("C.in","r",stdin);
//  freopen(".out","w",stdout);

    int p1='@',p2='[',p3='`',p4='{';

    string s;
    cin>>s;
    int len=s.length();
    int res=0;
    Rep(i,len) {
        if (!isalpha(s[i])) continue ;
        int ind=tolower(s[i])-'a'+1;
        int k1=0,k2=0;      
        if (p1<s[i]&&p2>s[i]) k1=ind;
        if (p3<s[i]&&p4>s[i]) k2=ind;
        res+=k1-k2;
    }
    cout<<res<<endl;

    return 0;
}

D.Rosetta Problem

已知a,然而题目确实这样的

++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+
++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>+++++++
+++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>.<<<<<<<<<<>>>>>>>>>>>>>>++.--<<<<<<<<<
<<<<<>>>>>>>>>>>>>+.-<<<<<<<<<<<<<>>>>>>>>>>>>>>--.++<<<<<<<<<<<<<<>>>>>>>>>
>>>>>>----.++++<<<<<<<<<<<<<<<>>>>.<<<<>>>>>>>>>>>>>>--.++<<<<<<<<<<<<<<>>>>
>>>>>>>>>>>---.+++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>
>>>>++.--<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>++.--<<<
<<<<<<<<<<<.

DCBA:^!~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHdcbD`Y^]\UZYRv
9876543210/.-,+*)('&%$#"!~}|{zyxwvutsrqponm+*)('&%$#cya`=^]\[ZYXWVUTSRQPONML
KJfe^cba`_X]VzTYRv98TSRQ3ONMLEi,+*)('&%$#"!~}|{zyxwvutsrqponmlkjihgfedcba`_^
]\[ZYXWVUTSonPlkjchg`ed]#DCBA@?>=<;:9876543OHGLKDIHGFE>b%$#"!~}|{zyxwvutsrqp
onmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMibafedcba`_X|?>Z<XWVUTSRKo\

Rosetta Problem

v34*8+6+,78+9*3+,93+9*5+,28+9*1+,55+9*4+,23*6*2*,91,@,+7*9*25,*48,+3*9+38,+<
>62*9*2+,34*9*3+,66+9*8+,52*9*7+,75+9*8+,92+9*6+,48+9*3+,43*9*2+,84*,26*9*3^

首先,你需要发现,题目实际上是程序代码,解码后

Print number (Brainfuck) — http://ideone.com
of ones in (Malbolge) — http://www.malbolge.doleczek.pl/
base 8 (Piet) — http://www.rapapaing.com/blog/?page_id=6
notation of a (Befunge) — http://www.quirkster.com/iano/js/befunge.html

Print number of ones in base 8 notation of a

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int main()
{
//  freopen("D.in","r",stdin);
//  freopen(".out","w",stdout);

    ll p;
    cin>>p;
    int ans=0;
    while(p) {
        if (p%8==1) ans++;
        p/=8;
    }
    cout<<ans<<endl;

    return 0;
}

E.Out of Controls

给一张n点的无向完全图 (3 ≤ N ≤ 10),求任意2点最短路的最大值。
但代码中不能出现

define
do
for
foreach
while
repeat
until
if
then
else
elif
elsif
elseif
case
switch

据说很多解法

  1. Haskell
  2. 递归+?
  3. 注释

给大家一个简单的实现方法

#include<bits/stdc++.h>
using namespace std;
#defin\
e Fo2r(i,n) fo\
r(int i=1;i<=n;i++)
int f[11][11],n;
int main()
{
//  freopen("E.in","r",stdin);
//  freopen(".out","w",stdout);
    cin>>n;
    Fo2r(i,n) 
        Fo2r(j,n) {
            cin>>f[i][j];
        }
    Fo2r(k,n)
        Fo2r(i,n)
            Fo2r(j,n) {
                f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
            }
    int p=0;
    Fo2r(i,n) Fo2r(j,n) {
        p=max(p,f[i][j]);
    }
    cout<<p<<endl;
    return 0;
}

F. Ace It!

The only line of the input is a string of 7 characters. The first character is letter A, followed by 6 digits. The input is guaranteed to be valid (for certain definition of “valid”).
input
A221033
output
21
input
A223635
output
22
input
A232726
output
23

观察发现是扑克牌牌面的和,注意10,A

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int main()
{
//  freopen("F.in","r",stdin);
//  freopen(".out","w",stdout);
    char s[100];
    cin>>s;
    int i=0,ans=0;
    while(i<strlen(s)) {
        if (s[i]=='A') ans++;
        else if (s[i]=='1') ans+=10,i++;
        else if (isdigit(s[i])) ans+=s[i]-'0';
        ++i;
    }
    cout<<ans<<endl;

    return 0;
}

G. You’re a Professional

各一个n*m字符矩阵(只有Y,N),需要输出满足’Y’出现次数大于T的列数和
n,m<=10
水题

#include<iostream>
#include<cstdio>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
int n,m,t;
#define MAXN (12)
char s[MAXN][MAXN];
int main()
{
//  freopen("G.in","r",stdin);
//  freopen(".out","w",stdout);

    cin>>n>>m>>t;
    For(i,n) 
    {
        scanf("%s",s[i]+1);
    }
    int ans=0;
    For(i,m) {
        int p=0;
        For(j,n) if ('Y' == s[j][i]) ++p; 
        if (p>=t) ++ans;
    }
    cout<<ans<<endl;

    return 0;
}

然而评测姬傲娇
Support of this language is discontinued, starting today. Please rewrite your project using something more modern.
这里写图片描述

Hint:C++11,C++9,C11,这些是算一种的

没办法,只能这样

import java.io.*;
import java.util.*;
import java.math.*;

public class Main
{
    public static void main(String args[])
    {
        Scanner cin = new Scanner(System.in);
        int n,m,t;

        while(cin.hasNextInt())
        {
            n = cin.nextInt();
            m = cin.nextInt();
            t = cin.nextInt();
            int[] p= new int[11];
            for(int i=1;i<=n;i++) {
                String s= cin.next();
                for(int j=1;j<=m;j++) 
                    if (s.charAt(j-1)=='Y') ++p[j];
            }

            int ans = 0;
            for(int j=1;j<=m;j++) if (p[j]>=t) ans++;

            System.out.println(ans);
        }
    }

So many characters… Can’t your code be shorter? Please remove 46 more characters.
不能忍

import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[])
{Scanner cin = new Scanner(System.in);
int n,m,t;while(cin.hasNextInt()){n=cin.nextInt();m=cin.nextInt();
t = cin.nextInt(); int[] p= new int[11];
for(int i=1;i<=n;i++) {
String s= cin.next();
for(int j=1;j<=m;j++)
if (s.charAt(j-1)=='Y') ++p[j];
}
int ans=0;
for(int j=1;j<=m;j++) if (p[j]>=t) ans++;
System.out.println(ans);}}}

Needs a finishing touch… Can you add a kitten?
终于

import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[])
{Scanner cin = new Scanner(System.in);
int n,m,t;while(cin.hasNextInt()){n=cin.nextInt();m=cin.nextInt();
t = cin.nextInt(); int[] p= new int[11];
for(int i=1;i<=n;i++) {
String s= cin.next();
for(int j=1;j<=m;j++)
if (s.charAt(j-1)=='Y') ++p[j];
}
int ans=0;
for(int j=1;j<=m;j++) if (p[j]>=t) ans++;
System.out.println(ans);}}}//kitten

So many characters… Can’t your code be shorter? Please remove 4 more characters.
。。

import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[])
{Scanner cin=new Scanner(System.in);
int n,m,t;while(cin.hasNextInt()){n=cin.nextInt();m=cin.nextInt();t=cin.nextInt(); int[] p=new int[11];
for(int i=1;i<=n;i++){String s= cin.next();for(int j=1;j<=m;j++)if (s.charAt(j-1)=='Y') ++p[j];
}int ans=0;for(int j=1;j<=m;j++) if (p[j]>=t) ans++;System.out.println(ans);}}}//kitten

好了终于过了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值