2016Y GDUT新生杯初赛 Problem D: 有趣的游戏

来源:互联网 发布:淘宝联邦止咳水暗语 编辑:程序博客网 时间:2024/05/01 21:55

Problem D: 有趣的游戏

Description

有个小师妹找zhazhahe玩游戏。他们有一堆n个珠子,每人轮流拿走若干个,轮到谁的回合拿不了珠子就算输。给出一个n,每次能拿走的珠子数量在区间[l,r]内(如果剩余珠子不足就不能拿,判输),小师妹先开始拿。假设小师妹和zhazhahe都非常聪明,会采取最优策略,问谁会赢得游戏?

Input

有多组样例,第一行输入一个样例数T(0<T<=1000)

每个样例只有一行,三个正整数n,l,r (0<n<=1000) (0<l<=r<=1000)

Output

每个样例只有一行,如果小师妹赢了输出“Win”,输了就输出“Lose”。

Sample Input

3

4  1  4

7  2  6

10 3  6

Sample Output

Win

Win

Lose

分析解答:

哦~有趣的游戏,这是一道博弈题,虽然昂,讲道理,我目前很菜,不会写博弈题。这里直接上官方题解,等我补了博弈的知识再补上题解

类型:博弈

    分析:这种类型题的基本思路是找到一种恒定不变的方式,使得对方无论怎么拿,你都能找到对应要拿的数量

举个例子,假如n=22,取的区间为[1,2],那么小师妹第一次拿走1个,

使得剩下的数量21,是区间左右端点之和的倍数,即3的倍数.

那么无论对方怎么拿,我们都能维持剩下来的数量是3的倍数的状态不变,比如他拿1个,你就拿2个,或者他拿2个,你就拿1个

始终保持他能拿,我必能拿的状态,那么只要判断初始情况,我就知道我能不能稳赢

回顾刚刚的拿法,我们很容易推出一个方式判断第一个人应该如何拿,即余数=n%(L+R)  

          1.假设这个余数落在[L,R]里面,那么小师妹第一次把余数全抓走,剩下的是(L+R)的倍数,我们知道,小师妹稳赢

          2.假设这个余数为L-k (0<k<=L)(个人理解,也就是说小于L)里面,那么因为只能抓[L,R]个珠子,小师妹动不了余数这个数目,她只能先动(L+R)里面合法的某些数目,那么第二个人能对应着拿掉小师妹在(L+R)里面剩下的数目,情况变成小师妹稳输 

          3.假设这个余数落在R+L-k (0<k<L)(个人理解,也就是说大于L)里面,那么小师妹第一次拿走R个,剩下的数目为L-k即把第二种状态丢给对方,小师妹稳赢

上代码:

#include<iostream>using namespace std;int main(){    ios::sync_with_stdio(false);    int T;    cin>>T;    while(T--)    {        int n,l,r;        cin>>n>>l>>r;        int yet_have=n%(l+r);        if(yet_have<=r && yet_have>=l)        {            cout<<"Win\n";        }        else if(yet_have>r)        {            cout<<"Win\n";        }        else        {            cout<<"Lose\n";        }    }}


0 0
原创粉丝点击