码迷,mamicode.com
首页 > 其他好文 > 详细

巴什博弈

时间:2018-08-15 20:38:12      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:scanf   amp   can   class   names   就是   iostream   using   \n   

处理何种问题:有n个石子,两个人轮流取石子,规定至少取1个,最多取k个,最后取光者获胜。

 

性能:时间复杂度为O(1)

 

原理:n%(k+1)==0,后手必胜(先手无论怎么取,后手只需要补全至k+1个即可);n%(k+1)!=0,先手必胜(先手只需要第一次将n%(k+1)的余数取尽,先手就转成“后手”了)

 

实现步骤:略

 

备注:遇到此类问题可向巴什博弈方向转化,例如:有n个石子,两个人轮流取石子,规定至少取1个,最多取k个,最后取光者输掉游戏(区别于上面赢)。因为是取掉最后一个必输,也就是说,最后一局取走的石子数肯定是1,所以问题就变为有(n-1)个石子的巴什博弈了。

 

输入样例解释

55  6 // 55个石子,每次最多取6个

545  8

 

输出样例解释

First Win  //先手获胜

First Win

 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        if(n%(k+1)==0)
            printf("Second Win\n");
        else
            printf("First Win\n");
    }
    return 0;
}

  

巴什博弈

标签:scanf   amp   can   class   names   就是   iostream   using   \n   

原文地址:https://www.cnblogs.com/l1l1/p/9483453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!