HDOJ HDU 1846 Brave Game ACM 1846 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=1846
题目描述:
Problem Description
十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻。
今天,大家选择上机考试,就是一种勇敢(brave)的选择;这个短学期,我们讲的是博弈(game)专题;所以,大家现在玩的也是“勇敢者的游戏”,这也是我命名这个题目的原因。
当然,除了“勇敢”,我还希望看到“诚信”,无论考试成绩如何,希望看到的都是一个真实的结果,我也相信大家一定能做到的
~

各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
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

题目分析:

巴什博弈,一个人拿1~m个,那谁面对m+1的局势的的时候则必败,很明显,先拿的就是要造这个局势,如果n是(m+1)*r+s(k为任意,s<m+1),那么很明显先拿的拿掉s后,然后无论下一个拿多少你都可以保证你拿完后都是拿了m+1个,这样后拿的必定面对必败局势,比如23 2,23=(3×7)+2;那我第一次拿掉2,然后无论每次第二个拿几我都可以使得这轮总共拿3,然后他必定会面对3这个局势,然后我就必胜,那什么时候必败呢,很明显如果我面对的是(m+1)的倍数的局势就必败。
puts ( n % ( 1 + m ) != 0 ? "first" : "second" );

结果竟然被这题给阴了....while(scanf("%d",&c)!=EOF) --> 结果WA, YM
然后改成  scanf("%d",&c)  居然 AC 了. ...................悲剧~~~


代码如下 :
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include <iostream>
int main ()
{
    int T;
    scanf ( "%d",&T );
    {
            while ( T -- )
            {
                    int n,m;
                    scanf ( "%d%d", &n, &m );
                    puts ( n % ( 1 + m ) != 0 ? "first" : "second" ); 
            }
    }
    return 0;
}

你可能感兴趣的:(HDOJ HDU 1846 Brave Game ACM 1846 IN HDU)