欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CodeForces April Fools Contest 2018题解

程序员文章站 2022-04-09 21:08:57
[比赛链接](http://codeforces.com/contest/952) 感觉可能比洛谷的题目正常一点 就当学英语了吧 A Quirky Quantifiers比较正常,不是什么很坑的题目。 判断奇偶性即可 Code: B A Map of the Cat 给你两种猫的被膜的感受,判断是哪 ......

[比赛链接](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!
如果你去过首家上线的线上澳门赌场,那你这道题能迅速理解。

CodeForces April Fools Contest 2018题解

(如果你看见过的话 自觉面壁)

这道题目就是一个欧非测试机,你可以选择green,black,red,odd,even来猜测这个珠子最后停留在哪里。

如果你是个欧皇,你可以用绿色一遍过这道题。绿色几率是1/19,并且要两次都赢才算通过。

CodeForces April Fools Contest 2018题解

Code:

E Cheese Board

这道题我没看出来题目名字和要求有什么联系……我还看了半天WiKi

cheese board本意是干酪板,和chess board很像……就没了

这道题要求是给出最小的矩阵大小,能放下所有的奶酪。硬的和软的要交替放置,可以空着,但软硬相同的不能放一起。

暴力枚举,棋盘分为两部分,一部分为(n^2+1)/2,另一部分为(n^2)/2 只要满足软硬中少的比第二个小,大的比第一个小即可。

:CodeForces April Fools Contest 2018题解

 

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"(艹脑)**

这种语言有八个运算符,

CodeForces April Fools Contest 2018题解

看起来就像汇编一样。

有人做了一个可以详细解释这种语言的小工具 叫Brainfuck Visualizer

https://fatiherikli.github.io/brainfuck-visualizer/

这道题意就是给你一个字符串,让你输出一个加密后的**BrainFuck**程序来输出这个字符串。

规则:

CodeForces April Fools Contest 2018题解

.......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 }