2188题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188
2149题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2149
1846题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1846
两个题都倒过来想,假如现在募捐箱里面有n元钱,两个人每次至少取一元钱,最多取m元钱,最后一个取光的人为胜者,就是一个简单的巴什博弈。
第三个题本来就是倒着的。
巴什博弈:有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜。
1.我们现在想想假如现在局面上就剩下了m + 1个物品,那么先手必输,自己想为什么。
2.现在推广到 n = k * ( m + 1)个物品,假设先手取 t个,那么后手只要保证每次都取 m + 1 - t个,那么最后还是转化到第一种情况。
3.如果 n = k * ( m + 1) + a ( 0 < a <= m) ,那么先手必胜了,因为只要先手取a个,就变成了第2种情况的后手,所以必胜!
代码:
2188
#include <cstdio> int main() { int _; while(~scanf("%d",&_)) { while(_--) { int n,m; scanf("%d%d",&n,&m); if(n % (m + 1) == 0) printf("Rabbit\n"); else printf("Grass\n"); } } return 0; }
2149
#include <cstdio> int main() { int m,n; while(~scanf("%d%d",&m,&n)) { if(m < n) { for(int i = m;i <= n;++i) { if(i == m) printf("%d",i); else printf(" %d",i); } printf("\n"); } else if(m % (n + 1) == 0) printf("none\n"); else { printf("%d\n",m % (n + 1)); } } return 0; }
1846
#include <cstdio> int main() { int _; scanf("%d",&_); while(_--) { int n,m; scanf("%d%d",&n,&m); if(n % (m + 1) == 0) printf("second\n"); else printf("first\n"); } return 0; }