【bzoj1022】小约翰的游戏John

Portal -->bzoj1022

Solution

?  ?这题其实是裸的反Nim,这里主要是为了写反Nim游戏的证明

?  ?首先给出反Nim(anti-nim)的定义和结论:

【定义】桌子上有 N 堆石子,游戏者轮流取石子; 每次只能从一堆中取出任意数目的石子,但不能不取;取走最后一个石子者败

【结论】先手必胜当且仅当满足下面两个条件中的一个

?  ?(1)所有堆的石子数都为\(1\)且游戏的\(sg\)值为\(0\)

?  ?(2)有些堆的石子数大于\(1\)且游戏的\(sg\)值不为\(0\)

? ?  ?

?  ?然后我们来证明anti-nim游戏的结论,可以分成两种情况讨论(以下内容摘自论文):

1、每堆只有\(1\)个石子:

?  ?那么显然先手必胜当且仅当石子堆数\(n\)为偶数

2、其他情况:

??  ?(1)当游戏的\(sg\)值不为\(0\)时:若还有至少两堆石子的数目大于$ 1$,则先手将 \(sg\)值变为 $0 \(即可;若只有一堆石子数大于\) 1$,则先手总可以将状态变为有奇数个\(1\)(可以把大于\(1\)的那堆直接取完或者取剩\(1\)个),所以,当\(sg\)不为\(0\)时先手必胜

??  ?(2)当游戏的\(sg\)值为\(0\)时:至少有两堆石子的数目大于 \(1\),则先手决策完之后,必定至少有一堆的石子数大于 \(1\),且\(sg\)值(当前游戏局面的)不为\(0\),由上段的论证我们可以发现,此时,无论先手如何决策,都只会将游戏带入先手必胜局,所以先手必败

?  ?

?  ?代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,T,ans,cnt;

int main(){
#ifndef ONLINE_JUDGE
    freopen("a.in","r",stdin);
#endif
    int x;
    scanf("%d",&T);
    for (int o=1;o<=T;++o){
        ans=0; cnt=0;
        scanf("%d",&n);
        for (int i=1;i<=n;++i){
            scanf("%d",&x),ans^=x;
            if (x>1) ++cnt;
        }
        if (cnt==0) printf(n%2?"Brother\n":"John\n");
        else printf(ans?"John\n":"Brother\n");
    }
}

原文地址:https://www.cnblogs.com/yoyoball/p/9425543.html

时间: 2024-08-29 21:49:16

【bzoj1022】小约翰的游戏John的相关文章

bzoj千题计划112:bzoj1022: [SHOI2008]小约翰的游戏John

http://www.lydsy.com/JudgeOnline/problem.php?id=1022 http://www.cnblogs.com/TheRoadToTheGold/p/6744825.html #include<cstdio> #include<iostream> using namespace std; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar();

bzoj1022: [SHOI2008]小约翰的游戏John(博弈SG-nim游戏)

1022: [SHOI2008]小约翰的游戏John 题目:传送门 题目大意: 一道反nim游戏,即给出n堆石子,每次可以取完任意一堆或一堆中的若干个(至少取1),最后一个取的LOSE  题解: 一道很不错的题目啊,感觉可以作为一道很好的入门题 读前一戳:博弈论文 && POPQQQ大佬%%% 大体要分为三种情况来讨论: 1.全是为1的石子堆,如有偶数堆则先手胜,反之后手胜 2.有两堆相同的石子且都不为1(后手获胜的几率很大):     那么如果先手将其中一堆取剩1,那么后手就可以将另一堆

[Bzoj1022][SHOI2008]小约翰的游戏John(博弈论)

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2976  Solved: 1894[Submit][Status][Discuss] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先

1022: [SHOI2008]小约翰的游戏John

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1322  Solved: 829[Submit][Status] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,

【BZOJ 1022】 [SHOI2008]小约翰的游戏John

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1375  Solved: 865 [Submit][Status] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优

SHOI2008小约翰的游戏John

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1139  Solved: 701[Submit][Status] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,

bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1189  Solved: 734[Submit][Status] Description 小 约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意 多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优

1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2709  Solved: 1726[Submit][Status][Discuss] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先

BZOJ1022: [SHOI2008]小约翰的游戏John(Nim博弈)

Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误.小约翰一怒之前请你来做他的参谋.自然,你应该先写一个程序,预测一下谁将获得游戏的胜利. Input 本题的输入由多组数据组成第一行包括一个整数T,

[BZOJ1022] [SHOI2008] 小约翰的游戏John (SJ定理)

Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误.小约翰一怒之前请你来做他的参谋.自然,你应该先写一个程序,预测一下谁将获得游戏的胜利. Input 本题的输入由多组数据组成第一行包括一个整数T,