题意:Con先手,把每堆石头分成另外二部分,当每堆的石头都为1时当前人输。
首先我们取最大的那个堆来考虑,不要按照模拟这个游戏的过程的思路走,因为最后是最大的那个堆影响结果,小的堆或者分的小的堆可以直接忽略。
设当前最大堆石头数量是否能赢的状态为y,那么如果y是必败态,那么y+1,y+2,…,2*y都是必胜态,2*y+1是必败态,如果y是必败态 那么y+1,y+2,…,2*y 我都可以选择让下种状态变成y 所以这些是必胜态。
对先手来说1必败 2必胜 3必败 4必胜 5必胜 6必胜 7必败 8必胜 2^x-1是这样递推出来的,你会发现只要他足够机智,一定能赢,对于其他不是最大的石子 那么他每次都让他减半,这就会导致每次操作后 剩下石子堆里的最大的那个石子堆一定是前一次操作的最大的石子队分离出来的。为什么要把其他都分一半,因为要采取最优策略啊,默认的他和他的对手是足够“机智”的。。
#include <bits/stdc++.h> using namespace std; int main() { // freopen("in.txt","r",stdin); int n,tt; int t; cin>>n; int Max = 0; while(n--) { cin>>tt; Max = max(Max,tt); } bool flag = false; Max += 1; int d = log2(double(Max)); if(pow(2,d)==Max) flag = true; if(!flag) cout<<"Constantine"; else cout<<"Mike"; return 0; }