2 23 2 4 3
first second
只有一堆共n个物品,两个人轮流从这堆物品中取物,每个人最少取1个最多取m个,最后取光着获胜。
在这里要声明,做博弈题目,要按照每个人都是最优的情况进行,就是怎样对自己最有利,那就怎么去做。如果不懂最优的含义,可以看前缀。
前缀:
对于这道题目,假设有3个物品,一次最多拿2个,不要想着先拿的人先拿1个,后拿的人再拿1个,先拿的人再拿1个,得出结果 先拿的人获胜。
应该这么考虑,为了让自己获胜,先拿的人要给人家剩余m+1的情况,但是每次必须拿一个,所以,没办法,只能拿一个(其实拿多少无所谓了,因为一定会输),后拿的人面对剩余的2个,为了使自己获胜,当然全拿走。
正文:
前缀说完,重回本题。如果n=m+1,因为最多取m个,所以先拿的人拿多少个,后拿的人能全拿走。
由此可以总结出 取胜秘籍: n=(m+1)*r+s (r为任意自然数,s为小于等于m)。
那么先取者拿走s个物品,如果后取者拿走K(≤m)个,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
于是,这道题解法就出来了,只要判断 n%(m+1)是否等于等于0。
等于0代表,无论怎么取,最后都会剩下<=m个,因此后取者将会获胜。
/************************************** *************************************** * Author:Tree * *From :http://blog.csdn.net/lttree * * Title : Brave Game * *Source: hdu 1846 * * Hint : 巴什博弈 * *************************************** **************************************/ #include <stdio.h> int main() { int test,m,n; scanf("%d",&test); while(test--) { scanf("%d%d",&n,&m); if( n%(m+1) ) printf("first\n"); else printf("second\n"); } return 0; }