HOJ 1367 A Stone Game(anti-nim)

版权声明:本文是博主乱写的文章,可以随便转载 https://blog.csdn.net/weixin_43768644/article/details/89305895

题目链接http://acm.hit.edu.cn/problemset/1367

解题思路:这个nim游戏是谁取最后一份谁输.(0堆的时候相当于上一个人取完了最后一堆,先手必胜)

假设n堆异或和为nim

有以下状态:

①:每堆为1

--->nim=0,偶数堆     nim!=0,奇数堆   对应:

     先手必胜                先手必败

②:有一堆大于1个,其余为1个

--->由堆数奇偶判断大于1个的那堆剩一个还是取完

先手必胜

③:至少有两堆大于1个:

(1)nim=0,取一次后转化为②或者③(2)

(2)nim!=0,必定可以转化为nim=0且至少有两堆大于1,也就是转化为③(1)

(这里我只知道nim=0,没法严格证明取完之后还能保证有两堆,以后知道了来补一下。)

分析:当初始状态为③(2),一定会在不停地取中使得自己变为②,所以③(2)状态先手必胜

           当初始状态为③(1),一定会不停地取使得对方变为②,先手必败

总结:

先手必胜两种情况:

①nim=0,全是1

②nim!=0,有大于1的

代码:

#include<cstdio>
#include<cstring>
int main()
{
    int n;
    while (~scanf("%d",&n)){
        int ans=0,x,morethan1=0;
        for (int i=0;i<n;i++){
            scanf("%d",&x);
            ans ^= x;
            if (x>1) morethan1 = 1;
        }
        if ((ans==0 && morethan1==0)||(ans>0 && morethan1==1)) printf("Louis\n");
        else printf("Lester\n");
    }
    return 0;
}

博弈论暂时告一段落,学线段树去啦。

猜你喜欢

转载自blog.csdn.net/weixin_43768644/article/details/89305895