-
输入
- 第一行是一个正整数n表示有n组测试数据
输入有不到1000组数据,每组数据一行,有两个数N和M,之间用空格分隔。
输出 - 对于每组数据,输出一行。如果先取的TT可以赢得游戏,则输出“Win”,否则输出“Lose”(引号不用输出) 样例输入
-
2 1000 1 1 100
样例输出 -
Lose
Win
-
-
这个ACM问题看起来很复杂,但实际上非常的简单,代码也就十行就能解决的问题。(不好意思,前提是你理解了题目)
-
PS:要睡觉了,我有强迫症睡前写一篇博客,但是又困,所以就随便写个简单的╮(╯▽╰)╭
-
与其说是ACM,倒不如说这是到数学题。
-
-
分析:
-
呐,首先我要说两个情景:(情景里面的甲乙都很聪明,做出的选择都是最优解)
-
情景1:假设有一堆石子m+1个,两个人(甲,乙)玩题目描述的游戏,每人最多拿m个(m<=n),且不能不拿,不拿直接拖出去打死!不难知道,无论一开始甲拿多少个,都是乙赢。因为甲拿k个(k<=m),剩下的m+1-k个石子乙一次全部拿完就赢了。
-
情景2:现在厉害了,升华一下,有n个石子,我们把n个石子看成是n=(m+1)r+s 【s<=m】,甲一开始拿s个,乙再拿k个,然后甲再拿m+1-k个,联系情景1,接下来保持情景1的取法(乙拿k个,然后甲拿m+1-k个,这样轮回),最终甲赢!
-
-
那么现在问题来了,说了那么多,所以判断先取的人赢得条件是什么?对不起你的脑子搭UBER跑了!
-
多以最终第一个人能不能赢,就看第一个人有没有n=(m+1)r+s里面的s拿,换句话说N%(M+1)==0这个就是关键!
-
-
以下是代码实现:
#include<iostream> using namespace std; int main() { int n,N,M; cin>>n; while(n--) { cin>>N>>M; if(N%(M+1)==0) cout<<"Lose"<<endl; else cout<<"Win"<<endl; } return 0; }
-
好了,睡觉。
取石子(一)
最新推荐文章于 2024-07-11 13:09:12 发布
描述
一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子。游戏的规则是这样的。设有一堆石子,数量为N(1<=N<=1000000),两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利。我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么?