第一弹


 

Moscow Pre-Finals Workshop 2016 - Kent Nikaido Contest 1 Problem K. Pyramid Game

http://opentrains.snarknews.info/~ejudge/team.cgi?SID=afa73761fd0d61ae&action=2&lt=1

题意:

N堆石头,两个人轮流取。有2种操作:一是选择一堆石头拿走一个,二是从每堆石头拿走一个,但是只有当所有堆都非零的时候才能用第二种操作。 谁不能操作谁就输了。

 

题解:
1. 如果只有第一种操作,那么如果轮到某个人的时候剩下奇数个石头,他就可以赢。定义这样的局面是对他有利的。

2. 如果N为奇数,用第二种操作实际上不会改变局面对谁有利。 直接根据sum的奇偶判断。

3. 如果N为偶数,那么用一次第二种操作可以改变局面对谁有利。 考虑如果轮到某个人时,存在某一堆石头只有1个,那么如果当前局面对他有利,他直接用操作一拿走这个石头,如果对他不利,先手可以用一次操作二, 之后两个人都不能用操作二了。 所以不管怎样都是他赢。  换一个角度来看,如果某堆石头只有2个,那么显然不能去动它,否则就会把一个1留给对手。  因此问题转化为将每一堆石头都减去2个的子问题。   所以不断转化为子问题,只要考虑最少的那堆石头的奇偶性和sum的奇偶性就可以判断出答案了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n, a[100];
 7     cin >> n;
 8     int s = 0, mi = 100;
 9     for (int i = 1; i <= n; ++i)
10     {
11         cin >> a[i], s += a[i], mi = min(mi, a[i]);
12     }
13     
14     if (n & 1)
15     {
16         if (s & 1) puts("Iori");
17         else puts("Yayoi");
18     }
19     else
20     {
21         if (mi & 1) puts("Iori");
22         else
23         {
24             if (s & 1) puts("Iori");
25             else puts("Yayoi");
26         }
27     }
28     
29     return 0;
30 }
View Code

相关文章:

  • 2022-12-23
  • 2023-04-08
  • 2021-05-21
  • 2022-12-23
  • 2022-12-23
  • 2021-10-16
  • 2021-09-04
  • 2022-12-23
猜你喜欢
  • 2022-01-21
  • 2022-12-23
  • 2021-10-30
  • 2022-02-22
相关资源
相似解决方案