HDU 3951 博弈论

HDU 3951 博弈论

题意:给你n个硬币,把它围成一个圆圈。现在有两个人玩这样的一个翻转游戏,每次翻转1--k个硬币,最后一个翻转硬币者胜。

显然是一道博弈论的题目。破题的关键在于最后一个翻硬币的人让对手在前一次无计可施。

如何才能做到呢?题目提供了一个新的特性,断开的硬币不能取走,只能取走一串相连的硬币。

那么显然,获胜者必须提供对手一段断开的硬币,对手取走,己方获胜。

那么怎么造成这段断开的硬币呢?显然,当对手在他的最后一次选择中,是拥有主动权来改变结局的。

(既然己方想要获胜)但是他无论如何选择,结果都是一样的。那么就造成结果相等,不如让对手面对两个一摸一样的选择(两端相等的硬币段)

如果到了这个地步,己方就完全获得了主动权,不论接下来怎么走,对手的失败已经注定。

那么如何才能维持这个势来呢?(两端相等的硬币段),不妨以对称的眼光看问题:既然最后是对称的,过程中也保持对称才好。对手如何对一段硬币段分割,己方就如何对另一端硬币段分割,这样无论分出了多少段硬币,始终是对称的。不断地取,最终会只剩下两端相等的硬币段。势就保存下来了。

那么谁能获得这个势呢?显然是第一个能把整环硬币分为对称的两端的人。

1.如果第一个人能够一次拿走,(^-^)显然获胜。

2.如果两个人拿且只能拿一个,两个人都不具备主动权。奇数先手胜,偶数后手胜。

3.如果正常进行,第一个人把环变成一段,第二个人无论如何都可以把一段分成对称的两段。显然是后手获胜。

#include<iostream>
using namespace std;
int main()
{
    int i,n,k,T;
    cin>>T;
    for(i=1;i<=T;i++)
    {
        cin>>n>>k;
 cout<<"Case "<<i<<": ";
        if(k==1&&n%2==1||n<=k)
            cout<<"first"<<endl;
        else
     cout<<"second"<<endl;
    }
    return 0;
}
以上。

你可能感兴趣的:(HDU 3951 博弈论)