Southeastern European Regional Programming Contest Bucharest, Romania – Vinnytsya, Ukraine Porblem J
题目链接:https://codeforces.com/group/xrTA2IaQje/contest/255050
这是一个无效链接,当然如果咱们在一个学校那当咱没说,这是咱学校Group里的。
博弈论的题目,训练赛的时候我最后一个小时吭吃瘪肚的推了半天wa在test5上,无聊的分享一下手稿
题意:三人尼姆博弈,后俩人想置第一人于死地,而第一个人置之死地而后生。
题解:我先统计一下非1的数cnt,在统计一下为2的数(这个给我比赛的时候就算再给一点时间够呛能想到)
1.cnt大于2的时候第一个人是必输的。菜鸡只能手动打表看出来(哭)
2.cnt等于1的时候第一个人先手是必胜的,后一种状态很容易从前一种状态中推出来;
3.cnt等于2时n≡2(mod3)时第一个人又是必败的,但是如果那两个不为1的数全不为2的时候第一个人还是必败的,这个可以自己推一下,反正这个我补题的时候是补哭了。然后他才能必胜。
4.cnt等于0的时候n≡3(mod3)必败否则必胜
下面可食用代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int main(){
int n;
int a[maxn];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int cnt=0;int cnt1=0;
for(int i=0;i<n;i++)
{
if(a[i]!=1)
{
cnt++;
if(a[i]==2)
{
cnt1++;
}
}
}
if(cnt>2)
{
cout<<"Lose"<<endl;
}
else if(cnt==2)
{
if(n%3==2)cout<<"Lose"<<endl;
else
{
if(cnt1)
cout<<"Win"<<endl;
else
cout<<"Lose"<<endl;
}
}
else if(cnt==0){
if(n%3==0)cout<<"Lose"<<endl;
else{
cout<<"Win"<<endl;
}
}
else{
cout<<"Win"<<endl;
}
}