第一弹:
Moscow Pre-Finals Workshop 2016 - Kent Nikaido Contest 1 Problem K. Pyramid Game
http://opentrains.snarknews.info/~ejudge/team.cgi?SID=afa73761fd0d61ae&action=2<=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 }