• HDU1847Good Luck in CET4 Everybody!(巴什博弈入门)


    先不说1847这道题,我们先从巴什博弈入手,理解了巴什博弈,相信这道题便迎刃瓦解。

    巴什博弈(定理献上):

                  只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m.最后取光者得胜.

           n = (m+1)r+s , (r为任意自然数,sm), n%(m+1) != 0, 则先取者肯定获胜。

    巴什博弈还是很好理解滴,以你是先手的角度考虑。你想把对手给弄垮,那么每一局,你都必须构建一个局势,这个局势就是每次都留给对手m+1的倍数个物品(为什么留给m+1倍就一定能赢,你稍微动动脑子就出来了)。所以不只是取物品中的博弈可以用到巴什定理,还可以是报数之类的,看谁先报到100.并且每次报的数必须是1~10(包括1跟10),那么你每次都应该留给对手剩下的报数个数为11的倍数。


    当当,转到此题来。题目为:

    1、  总共n张牌; 
    2、  双方轮流抓牌; 
    3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…) 
    4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;

    如果你是先手,那么请考虑你的必胜点。由于规定只能去2的幂次,那么只要你留给对手的牌数为3的倍数时,那么你就必赢,因为留下3的倍数时,对手有两种情况:1,要么取剩下1,给你胜利  2,要么对手取了一点点儿,轮到你时,你就又可以构造一个3的倍数了嘛。   所以无论哪种情况,当你留给对手为3N的时候,你是必胜的。好吧,题目说你就是Kiki,那么当牌数为3的倍数时,Kiki就输了。因为一出来,上帝就留给了Kiki一个3的倍数。没办法,但是如果一开始上帝留给Kiki的不是3的倍数,那么Kiki肯定能够用先手的优势构造出3的倍数,那么Kiki就必胜。所以代码是异常的简单啊。

    码出代码为:

    #include<iostream> 
    using namespace std; 
    int main(void

        int n; 
        while(scanf("%d",&n)==1
        { 
            if(n%3==0
                cout<<"Cici"<<endl; 
            else 
                cout<<"Kiki"<<endl; 
        } 
        return 0



  • 相关阅读:
    adb常用命令和工具
    playwright学习记录
    vue,element-ui表格,多个单元格值可修改(点击聚焦后变成input,失去焦点请求保存)
    vue,element-ui表格,合并单元格,如果需要合并的数据隔行,需要重新排列数组
    cas-5.3.x接入REST登录认证,移动端登录解决方案
    企业级cas5.3登录页面修改
    cas实现单点登录mysql,oracle双版本
    Mycat实现MySQL主从复制和读写分离(双主双从)
    IDEA安装插件后默认存放的位置
    值得推荐的Idea十几大优秀插件
  • 原文地址:https://www.cnblogs.com/cchun/p/2520096.html
Copyright © 2020-2023  润新知