巴什博弈

处理何种问题:有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
");
        else
            printf("First Win
");
    }
    return 0;
}

  

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