题意:
之前理解错了题意了,没有看清楚
每一次都是将所有的石子都分一遍(这样的话就只用考虑最大堆即可)
两个人轮流分石子,Constantine这个人先手
每次将每一堆石子分为两堆,如果这一堆只有一个石子就不用分了
最后一个人没有办法再分堆的时候就输了
题解:
草稿纸上递推模拟:
1 败
2 胜(因为2分解得到1+1导致另外一个人败)
3 败(因为3分解得到2+1导致另外一个人胜)
4 胜(因为4分解得到2+2导致另外一个人败)
5 胜(因为5分解得到3+2导致另外一个人败)
6 胜(因为6分解得到3+3导致另外一个人败)
7 败(因为7任意一种分解后无法使另外一个人败)
..........
..........
最后我们可以发现
1 3 7 15 31 ..........
这些数字是一定失败的
故有了下面的代码
#include<stdio.h>
int main()
{
int n;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
int t=0,temp;
while(n--)
{
scanf("%d",&temp);
t=t>temp?t:temp;
}
long long cnt=1;
while(cnt<t)
cnt=cnt*2+1;
puts(cnt!=t?"Constantine":"Mike");
}
return 0;
}