Guns and Roses (1)(两个人吃葡萄,看谁最后能刚好吃到葡萄没有,取余看余数)

Guns and Roses (1)
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description

Guns和Roses是两个好朋友,这一天他们比赛吃葡萄。假定他们有ANS颗葡萄。
在比赛之前他们会首先确定每次吃葡萄的数量的最大值为S,和ANS的具体值。
两个人轮流吃葡萄,每次最多吃S颗,不能不吃。(即假定每次吃M颗葡萄,则 1<=M<=S)
游戏规定在谁吃完葡萄后,他们两个人所吃的葡萄总和等于ANS,谁就获胜。
假定他们两人足够聪明,在吃葡萄的过程中都不会使值大于ANS。
现在规定Guns先手,请你帮助他计算为了确保最终取得胜利,他第一次应该吃多少颗葡萄?
若第一次无论吃多少颗葡萄,最终都无法取得胜利,请你输出 -1 。
Input

输入数据有多组,到 EOF 结束。
对于每组数据,输入有一行,包含用空格隔开的两个整数ANS,S。
1<=S<=2000
1<=ANS<=1000000
Output

对于每组数据,输出一行。
这一行包含一个整数,即Guns为了保证最终取得胜利第一次选择所吃的葡萄数目。(若无法保证最终取得胜利,则输出 -1)
Sample Input

9 4
123 8
14 6
Sample Output

4
6
-1

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int s,ans,r,f;
    while(~scanf("%d%d",&ans,&s))
    {
        f=0;
        r=ans%(s+1);
        if(r==0)f=1;
        if(f==0)
        {
            printf("%d\n",r);
        }
        else printf("-1\n");
    }
    return 0;
}

思路:为了让自己赢,就看最后一轮了,可以用总数进行取余,取余的是(报的最大数+报的最小数),为什么是最小数,因为如果每次每个人报的数最大值就是最小数的话,那如果不是最小数,我也就不能报个数使之和为最大值加最小值了,假设当这个人出完的时候我得出个数让他们的和等于(最大数+2)假如每次每个人最大报的数是1 ,如果我的运算时总数%(最大数+2)吧,但是我顶多出1,就实现不了了,例123 8,整除9运算完后是14 6,有余数那我们第一次就报余数6,然后后面每一轮因为是他先报,所以当我报的时候就让总数是9,那这样到最后一轮的时候,无论这个人怎么报,都不会超过9,他只会报从1~8的数,然后我报个数让他们的和等于9,就是我赢了,反之,如果没有余数,就是那个人赢了,因为是我先出嘛,这样的话主动权就在他的手里了
总结:这种吃东西,要使最后的人吃完后刚刚是总数,就是套路总数%(最大值+最小值),看余数,如果有余数就是我赢,反之就是别人赢你

猜你喜欢

转载自blog.csdn.net/bhliuhan/article/details/80687597