CodeForces April Fools Contest 2018题解
[比赛链接](http://codeforces.com/contest/952)
感觉可能比洛谷的题目正常一点
就当学英语了吧
A Quirky Quantifiers
比较正常,不是什么很坑的题目。
判断奇偶性即可
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int main() 5 { 6 scanf("%d",&n); 7 printf("%d\n",n%2); 8 return 0; 9 }
B A Map of the Cat
给你两种猫的被膜的感受,判断是哪种猫
可以发现no两种猫都有,great、not bad、cool、don't think so、don't touch me只有普通的猫有,根据这个来判断。
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s; 4 int main() 5 { 6 for (int i=0;i<=9;i++) 7 { 8 printf("%d\n",i); 9 getline(cin,s); 10 if (s=="no") continue; 11 if (s=="great"||s=="not bad"||s=="cool"||s=="don't think so"||s=="don't touch me") 12 printf("normal\n"); 13 else 14 printf("grumpy\n"); 15 } 16 return 0; 17 }
C Ravioli Sort
这道题介绍了面条排序。这种排序好像还有很多的名字,叫珠排序或是馅饼排序等等什么的。
主要就是将每个数字具体化为长度一定的面条,然后做*落体看哪根先落地即可。
O(n+物理引擎模拟) 即可 非常高效(搞笑)
但这和这道题没什么关系。**这道题是让你判断相邻两根面条长度差是否小于2,从而来优化这个面条排序。
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int num[11]; 5 int main() 6 { 7 scanf("%d",&n); 8 for (int i=1;i<=n;i++) 9 scanf("%d",&num[i]); 10 for (int i=1;i<n;i++) 11 if (abs(num[i]-num[i+1])>=2) 12 { 13 printf("NO\n"); 14 return 0; 15 } 16 printf("YES\n"); 17 return 0; 18 }
D I'm Feeling Lucky!
如果你去过首家上线的线上澳门赌场,那你这道题能迅速理解。
(如果你看见过的话 自觉面壁)
这道题目就是一个欧非测试机,你可以选择green,black,red,odd,even来猜测这个珠子最后停留在哪里。
如果你是个欧皇,你可以用绿色一遍过这道题。绿色几率是1/19,并且要两次都赢才算通过。
Code:
无
E Cheese Board
这道题我没看出来题目名字和要求有什么联系……我还看了半天WiKi
cheese board本意是干酪板,和chess board很像……就没了
这道题要求是给出最小的矩阵大小,能放下所有的奶酪。硬的和软的要交替放置,可以空着,但软硬相同的不能放一起。
暴力枚举,棋盘分为两部分,一部分为(n^2+1)/2,另一部分为(n^2)/2 只要满足软硬中少的比第二个小,大的比第一个小即可。
:
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,s1,s2,ans,s3,s4; 4 string str1,str2; 5 int main() 6 { 7 scanf("%d",&n); 8 for (int i=1;i<=n;i++) 9 { 10 cin>>str1>>str2; 11 if (str2=="soft") s1++; 12 else s2++; 13 } 14 s3=min(s1,s2); 15 s4=max(s1,s2); 16 while (true) 17 { 18 int cnt1=0,cnt2=0; 19 ans++; 20 cnt1=(ans*ans+1)/2; 21 cnt2=ans*ans-cnt1; 22 if (s4<=cnt1&&s3<=cnt2) break; 23 } 24 printf("%d\n",ans); 25 return 0; 26 }
F 2+2!=4
这道是脑洞题,绝壁是
好像是之前某个出题人犯了这个错误,现在挖出来嘲讽了。。
第二个样例 2+2=-46 乍一看直接懵逼
关键点就是要发现其中的玄机,这个运算把符号当作数字给运算掉了。比如2+2中,第二个“2”,其实是('+'-'0')×10+('2'-'0')=-48
特别神奇,然后'-'也同理。
然后回去看第一个样例,可以发现出题人是多么煞费苦心用心险恶地找了这组数据
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 char c; 4 int num1,num2; 5 char op=' '; 6 int main() 7 { 8 c=getchar(); 9 while (c!='\n') 10 { 11 if (c>='0'&&c<='9'&&op==' ') 12 num1=num1*10+c-'0'; 13 else if (c>='0'&&c<='9') 14 num2=num2*10+c-'0'; 15 if (c=='+'&&op=='+') 16 num1=num1+num2,num2=-5; 17 else if (c=='+'&&op=='-') 18 num1=num1-num2,num2=-5,op='+'; 19 else if (c=='+') 20 num2=-5,op='+'; 21 else if (c=='-'&&op=='+') 22 num1=num1+num2,num2=-3,op='-'; 23 else if (c=='-'&&op=='-') 24 num1=num1-num2,num2=-3; 25 else if (c=='-') 26 num2=-3,op='-'; 27 c=getchar(); 28 } 29 if (op=='-') num1-=num2; 30 else num1+=num2; 31 printf("%d\n",num1); 32 return 0; 33 }
G Puzzling Language
刚打开这道题时,我是懵逼的。
这道题涉及到一个语言,叫做**“BrainFuck"(艹脑)**
这种语言有八个运算符,
看起来就像汇编一样。
有人做了一个可以详细解释这种语言的小工具 叫Brainfuck Visualizer
https://fatiherikli.github.io/brainfuck-visualizer/
这道题意就是给你一个字符串,让你输出一个加密后的**BrainFuck**程序来输出这个字符串。
规则:
.......X....... ......XXX...... .....XXXXX..... ....XXXXXXX.... ...XXXXXXXXX... ..XXXXXXXXXXX.. .XXXXXXXXXXXXX. ............... X.............X X.............. X.............. X..............
这坨东西,就等于
- >+< >+++< >+++++< >+++++++< >+++++++++< >+++++++++++< < > . . .
结果就是输出三个$(这个程序貌似指针会越界,就假装他越界就不动吧)
然后想了好久没想出来,主要‘+’好像会对上面的格子产生影响。
最后找到了一个奇妙的解法,是某位外国友人提供的。
对于一个指针,它值为0时减去1就会变为255。
而'-'号有一个好处就是不会影响隔壁几个的意义。
所以每次每位减一减一,来达到目的。
之后输出即可
举个栗子 比如你要输出ASCII码为253的字符就可以这样打:
... .X. ... .X. ... .X. ... .X. .X.
这样就可以AC了
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int len; 4 string s; 5 int main () 6 { 7 cin>>s; 8 s='\000'+s; 9 len=s.length()-1; 10 for (int i=1;i<=len;i++) 11 { 12 int cnt=(int)(s[i-1]-s[i]); 13 cnt=(cnt+256)%256; 14 if (cnt==0) cnt=256; 15 printf("...\n"); 16 for (int j=1;j<=cnt-1;j++) 17 { 18 printf("...\n"); 19 printf(".X.\n"); 20 printf("...\n"); 21 } 22 printf("...\n"); 23 printf(".X.\n"); 24 printf(".X.\n"); 25 printf("...\n"); 26 } 27 return 0; 28 }
下一篇: 多出一百元