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;
    }

}

全部评论

相关推荐

11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务