K Cunning Friends
题目大意:Nim博弈,第二个人必须取两次。
题解:发现所有的数可以分为三种1,2,x,所有大于等于3的数的性质是等价的,因为它既不是第一个人必须拿完的,也不是第二个人必须拿完的一个状态。只有当1的个数足够多的时候,先手才必胜。因为后手两次操作可以跳过Nim博弈的必败态,只有1使得后手避不开必败态。只要有超过3堆不是1的情况,无论如何拿,先手都会留给后手两堆,后手直接取胜。因此只需要讨论3堆以内的情况,枚举必胜态,很快找出规律。
#include
#define rep(i,s,t) for (int i=s;i<=t;++i)
using namespace std;
int vis[110],sg[110];
int main(){
int n; scanf("%d",&n);
int cnt1=0,cnt2=0,cnt3=0;
rep(i,1,n){
int a; scanf("%d",&a);
if (a==1) cnt1++;
else if (a==2) cnt2++;
else cnt3++;
}
if (n%3==0){
if (cnt1==n-1) puts("Win");
else if (cnt1==n-2&&cnt2==2) puts("Win");
else if(cnt1==n-2&&cnt2==1&&cnt3==1) puts("Win");
else puts("Lose");
}
else if (n%3==1){
if(cnt1==n||cnt1==n-1) puts("Win");
else if (cnt1==n-2&&cnt2) puts("Win");
else puts("Lose");
}
else if (n%3==2){
if (cnt1==n||cnt1==n-1) puts("Win");
else puts("Lose");
}
return 0;
}