CodeForces April Fools Contest 2018题解

2018-06-17 20:52:11来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

[比赛链接](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 }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:25.C++- 泛型编程之函数模板(详解)

下一篇:笔试题——数独游戏实现