GOJ 1069

来源:互联网 发布:台湾ptt评淘宝用语 亲 编辑:程序博客网 时间:2024/06/05 02:57

这是一道简单博弈题。
1069题目
勇敢者的游戏(简单博弈)
Time Limit: 2000/1000ms (Java/Others)

Problem Description:
有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),而对于我们来说,参加这场“ War of Code”也是“勇敢者的游戏”。当然,除了“勇敢”,我们还希望看到“诚信”,无论考试成绩如何,希望看到的都是一个真实的结果,也相信大家一定能做到的~
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
1、 本游戏是一个二人游戏;
2、 有一堆石子一共有n个;
3、 两人轮流进行;
4、 每走一步可以取走1…m个石子;
5、 最先取光石子的一方为胜;
如果游戏的双方使用的都是最优策略,请输出哪个人能赢。

Input:
输入数据首先包含一个正整数C(C<=100),表示有C组测试数据。
每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述。

Output:
如果先走的人能赢,请输出“first”,否则请输出“second”,每个实例的输出占一行。

Sample Input:
2
23 2
4 3

Sample Output:
first
second

本题思路:因为双方采取的都是最优策略,即游戏最开始的数量n,m已经决定了哪个玩家的输赢。有n个石子,一次可以取最多m个,最少1个,赢的玩家必须拿到最后的石头,那么玩家想赢,必须把每回合取的石头总数控制在某个数中,且这个数能被n整除。因为一次可以取最多m个,最少1个,所以每回合取的石头总数为m+1的话,当n%(m+1)==0时,后来的玩家赢;(因为不管前面玩家怎么取,只要后面的玩家每次取的石头数量为(m+1-x),那么后面的玩家一定可以取到最后的石头)如果n%(m+1)!=0,则为前面的玩家赢(嘻嘻,这就反过来想就可以了,只要前面玩家第一次把n的数量变为n可以被(m+1)整除就可以了)

AC代码:

#include<iostream>using namespace std;int main(){    int T;    cin>>T;    while(T--)    {        int n;        int m;        cin>>n>>m;        if(n%(m+1))            cout<<"first"<<endl;        else            cout<<"second"<<endl;    }    return 0;}

版权声明:本文为博主原创文章,代码仅用于交流和学习!转载请注明出处!