博弈入门
巴什博奕
巴什博奕: 题目的 类型就是
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的: 1、 本游戏是一个二人游戏; 2、 有一堆石子一共有n个; 3、 两人轮流进行; 4、 每走一步可以取走1…m个石子; 5、 最先取光石子的一方为胜; 如果游戏的双方使用的都是最优策略,请输出哪个人能赢。
巴什博弈: 以上面的 题目为例 当 最后剩下只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.
只要能做到 给对方 留下 m+1 个 物品 己方就可以获得胜利 . 只要能做到一次的 将对方 挑选之前将剩下的物品数量变成 (m+1)*n 那么 当 地方挑选完之后 ,己方可以 将 剩余物品 在此变成 (m+1)*(n-1)
下面附上习题
Brave Game
http://acm.hdu.edu.cn/showproblem.php?pid=1846
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
1、 本游戏是一个二人游戏;
2、 有一堆石子一共有n个;
3、 两人轮流进行;
4、 每走一步可以取走1…m个石子;
5、 最先取光石子的一方为胜;
如果游戏的双方使用的都是最优策略,请输出哪个人能赢。
每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述。
下面附上 自己的 水货代码
// 如果 第一个人 要输的话 只能 在最开始的时候 第一个人 就陷入了 总数能被(n+1)整除的 困境 #include<stdio.h> int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(n%(m+1)) // 不等于0 的 情况下 执行下一句 printf("first\n"); else printf("second\n"); } return 0; }
悼念512汶川大地震遇难同胞——选拔志愿者
选拔规则如下:
1、最初的捐款箱是空的;
2、两人轮流捐款,每次捐款额必须为正整数,并且每人每次捐款最多不超过m元(1<=m<=10)。
3、最先使得总捐款额达到或者超过n元(0<n<10000)的一方为胜者,则其可以亲赴灾区服务。
我们知道,两人都很想入选志愿者名单,并且都是非常聪明的人,假设林队先捐,请你判断谁能入选最后的名单?
输入:
输入数据首先包含一个正整数C,表示包含C组测试用例,然后是C行数据,每行包含两个正整数n,m,n和m的含义参见上面提到的规则。
输出:
对于每组测试数据,如果林队能入选,请输出字符串"Grass", 如果徐队能入选,请输出字符串"Rabbit",每个实例的输出占一行。
1 // 如果 第一个人 要输的话 只能 在最开始的时候 第一个人 就陷入了 总数能被(n+1)整除的 困境 2 #include<stdio.h> 3 int main() 4 { 5 int t,n,m; 6 scanf("%d",&t); 7 while(t--) 8 { 9 scanf("%d%d",&n,&m); 10 if(n%(m+1)) // 不等于0 的 情况下 执行下一句 11 printf("Grass\n"); 12 else 13 printf("Rabbit\n"); 14 } 15 16 return 0; 17 }
Public Sale
通过打听,Lele知道这场拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加价的幅度要在1~N之间,当价格大于或等于田地的成本价 M 时,主办方就把这块田地卖给这次叫价的人。
Lele和Yueyue虽然考试不行,但是对拍卖却十分精通,而且他们两个人都十分想得到这块田地。所以他们每次都是选对自己最有利的方式进行加价。
由于Lele字典序比Yueyue靠前,所以每次都是由Lele先开始加价,请问,第一次加价的时候,
Lele要出多少才能保证自己买得到这块地呢?
输入:
本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。
每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100)
输出:
对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价。两个数据之间用空格隔开。
如果Lele在第一次无论如何出价都无法买到这块土地,就输出"none"。
1 #include<stdio.h> 2 int main() 3 { 4 int m,n,i,j,price; 5 while(scanf("%d%d",&m,&n)!=EOF) 6 { 7 price=m%(n+1); 8 if(price==0) 9 printf("none\n"); 10 else 11 { 12 printf("%d",price); 13 for(price++;price<=n&&price>=m;price++) 14 printf(" %d",price); 15 printf("\n"); 16 } 17 } 18 }