vijos1655萌萌的糖果博弈

//这个题是我今天做一道题,发现自己不会博弈论,所以去hzwer上找博弈论题,第一题是这个,发现这个题我看题面都看不懂。。。

题目已经写出来了,这是一道博弈论题
根据wzy 大佬的说法,博弈论题先找规律
然后给出我找规律的过程
先引用hzwer博客上的一句话

必胜策略是“所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。”就是说:我一操作保证剩下的一堆无论你怎么分你都赢不了!那我必胜.否则我不必胜

假设取了之后剩了一堆数量为x
(如果分解后的两堆中有1,那么另一方必胜,所以为了简洁,省略掉存在1的分解情况)
如果x=1,MM必胜,即如果未取堆为1的一方必胜
如果x=2,只能被分成两堆(1,1),SD必胜,即如果未取堆为2的一方能输
如果x=3,只能被分成两堆(1,2),SD可以胜,即如果未取堆为3的一方能输
如果x=4,可以分成(2,2),在分解为(2,2)情况下,两个能输的堆,必然会有一个输掉的剩余堆,所以MM必胜(这一点此后的证明(zhao gui lv)中不再赘述),即如果未取堆为4的一方能赢
如果x=5,可以分成(2,3),两个能输的堆,MM必胜,即如果未取堆为5的一方能赢
如果x=6,可以分成(3,3),两个能输的堆,MM必胜,即如果未取堆为6的一方能赢
如果x=7,可以分成(2,5)(3,4),不存在两个能输的堆的情况,所以SD能胜,即如果未取堆为7的一方能输
如果x=8,可以分成(2,6)(3,5)(4,4),不存在两个能输的堆的情况,所以SD能胜,即如果未取堆为8的一方能输
如果x=9,可以分成(2,7),两个能输的堆,MM必胜,即如果未取堆为9的一方能赢
如果x=10,可以划分为(2,8)(3,7)(4,6)(5,5),(3,7)为两个能输的堆,即如果未取堆为10的一方能赢
如果x>=11,可以有2,3,4,5,6,7,8,9,无需讨论

引用自hzwer博客:
> 想想看:如果有一堆糖果个数>=10.那它就能分出任意的0 1 2 3 4 5 6 7 8 9 个的堆…没有探讨的意义….知推0~9的规律..呵呵..0没有用的…

就是这样,然后是我的代码

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    string a,b;
    char c,d;
    while(1)
    {
        cin>>a;
        if(a=="-1")
        break;
        cin>>b;
        c=a[a.length()-1];
        d=b[b.length()-1];
        if((c=='2'||c=='3'||c=='7'||c=='8')&&(d=='2'||d=='3'||d=='7'||d=='8'))
        cout<<"SheepDaddy\n";
        else
        cout<<"MengMeng\n";
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值