2 1000 1 1 100
Lose Win
#include<iostream> using namespace std; int main() { int num,n,m; cin>>num; while(num--) { cin>>n>>m; if(n%(m+1)==0) cout<<"Lose"<<endl; else cout<<"Win"<<endl; } return 0; }
可想要理解为什么这样就可以得到正确结果,还要一番解释:
首先思考,自己最终如果获胜的话,那么说明最后轮到自己的时候,桌子上一定是剩有1~m个石子,那么在此之前的那一次,桌子上会是什么情况呢?
因为题目已经设定“两人都十分聪明”,所以,如果之前桌子上只剩下不到m个石子,那对方一定不会傻到只拿其中一部分,把胜利拱手相送。
那么如果剩余的多于m个呢?比如m+2个?
如果这样的话,那么对手完全可以只拿走一个,而你则只能输掉了。
所以,经过分析得知,只有在最后的倒数第二次,对手取石子时,桌子上还剩有m+1个这种情况,自己才能获胜!
可能有人会觉得:这赢的概率也太低了吧!
No!!!
别忘了我们有“先手”的优势!
这里便存在一个方法:第一次自己拿走一些石子之后,接下来假设对手取走了k个石子,那么我就一定要拿(m+1)-k个!这样一来,石子的减少量便是可以预测的了,即每两次减少m+1个(这里只能是m+1,原因自己理解)。
分析至此,便得出了一个致胜的方法:石子总数为n,第一次,自己应该取走k个,使得剩下的石子数(n-k)是(m+1)的整数倍。
很厉害的方法吧~
不过还是有一个小缺陷,就是万一n恰好就是(m+1)的整数倍的话,那就悲剧了,k怎么也不能是0啊!只能乖乖认输了。。。
Nyoj-23 取石子(一) (博弈游戏),布布扣,bubuko.com
原文:http://blog.csdn.net/harrypoirot/article/details/20071347