版权声明:本文是博主乱写的文章,可以随便转载 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;
}
博弈论暂时告一段落,学线段树去啦。