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; }以上。