先手胜当且仅当:
1. 所有堆石子数都为1且游戏的SG值为0.
2. 存在某堆石子数大于1且游戏的SG值不为0.
证明:
1. 若所有堆石子数都为1且SG值为0,则共有偶数堆石子,故先手胜.
2.
i) 只有一堆石子数大于1时,我们总可以对该堆石子操作,使操作后石子堆数为奇数且所有堆得石子数均为1.
ii) 有超过一堆石子数大于1时,先手将SG值变为0即可,且总还存在某堆石子数大于1.
#include<iostream>
#include<iomanip>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
cin.sync_with_stdio(false);
int N,Temp,Ans,Alone;
while (cin>>N)
{
Alone=0;
for (int i=0; i<N; i++)
{
cin>>Temp;
if (i==0)
Ans=Temp;
else
Ans^=Temp;
if (Temp>1)
Alone=1;
}
if (Alone==0)
{
if (N%2==1)
cout<<"No\n";
else
cout<<"Yes\n";
}
else
{
if (Ans==0)
cout<<"No\n";
else
cout<<"Yes\n";
}
}
return 0;
}
HDU 2509 Be the Winner Nim博弈
最新推荐文章于 2018-10-23 10:48:58 发布