链接:https://ac.nowcoder.com/acm/contest/9752/C
来源:牛客网
现在牛牛和牛妹一起出去海滩游玩,由于他们两个都不会游泳,所以他们在海滩捡了很多好看的贝壳,可是捡着捡着他们就感觉无聊了,所以他们决定拿这些贝壳玩一些游戏。
他们一共捡了n个贝壳,现在他们这n个贝壳放成一堆。然后轮流取贝壳,牛牛先取。牛牛一次能取[1,p]个贝壳,牛妹一次能取[1,q]个贝壳,能拿到最后一个贝壳的人赢
问牛牛和牛妹都足够聪明的情况下,最后谁能取得胜利
如果牛牛必胜,返回1
如果牛妹必胜,返回-1
如果没有人有必胜策略,返回0
示例1
输入
复制
8,3,3
返回值
复制
-1
示例2
输入
复制
3,4,2
返回值
复制
1
示例3
输入
复制
6,3,2
返回值
复制
1
示例4
输入
复制
6,3,5
返回值
复制
-1
备注:
对于100%的数据,1\leq n\leq 1e9,1\leq q,p\leq 1e9对于100%的数据,1≤n≤1e9,1≤q,p≤1e9
(其中30%的数据,p=q)(其中30%的数据,p=q)
bash博弈的升级版,如果n<p肯定第一个赢,如果说p=q;
如果n%(p+1)=0;那么先手必输,为什么呐,假定n=p+1,那么无论第一个怎么取,剩下的第二个都能取完,如果n是p+1的倍数,每一轮都是一样的,那么先手比败。
如果说p>q;
那么大的数就可以使n变为比败状态。
假如n=6,p=3,q=2;
p先拿3个,然后还剩3个,n%(q+1)=0;
q怎么拿,都会输。
假如
n=10, p=3,q=2;
p先拿一个,还剩9个,n%(q+1)=0;
q怎么拿,都会输。
假如n=10 p=2 q=3;
只要p一次性拿不完就必输,假如p拿2个,n=8;p拿2个,n=6;n%(p+1)=0;
p必输。
因为大的数可以有选择的跟小数一样,只要构造出了比败状态,那么它就赢了。
class Solution {
public:
/**
*
* @param n int整型
* @param p int整型
* @param q int整型
* @return int整型
*/
int Gameresults(int n, int p, int q) {
// write code here
if(n<p)
return 1;
if(p==q)
{
if(n%(p+1)==0)
return -1;
return 1;
}
return p>q?1:-1;
}
};