博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod 博弈模板题
阅读量:4618 次
发布时间:2019-06-09

本文共 2424 字,大约阅读时间需要 8 分钟。

连刷3道博弈模板题,算是稍微学习了以下三个经典博弈了。推荐一个。

第一道模板:Bash博弈——同余理论

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。
例如N = 3,K = 2。无论A如何拿,B都可以拿到最后1颗石子。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1行:每行2个数N,K。中间用空格分隔。(1 <= N,K <= 10^9)
Output
共T行,如果A获胜输出A,如果B获胜输出B。
Input示例
43 24 27 38 3
Output示例
BAAB
//Asimple#include 
//#define INF 0x3fffffff#define swap(a,b,t) t = a, a = b, b = t#define CLS(a, v) memset(a, v, sizeof(a))#define debug(a) cout << #a << " = " << a <
> T; while( T -- ) { cin >> n >> m; if( n%(m+1)!=0 ) cout << "A" << endl; else cout << "B" << endl; }}int main(){ input(); return 0;}

第二道:Nim游戏——异或理论

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 
有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N及每堆石子的数量,问最后谁能赢得比赛。
例如:3堆石子,每堆1颗。A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子。
 
Input
第1行:一个数N,表示有N堆石子。(1 <= N <= 1000)第2 - N + 1行:N堆石子的数量。(1 <= A[i] <= 10^9)
Output
如果A获胜输出A,如果B获胜输出B。
Input示例
3111
Output示例
A
//Asimple#include 
//#define INF 0x3fffffff#define swap(a,b,t) t = a, a = b, b = t#define CLS(a, v) memset(a, v, sizeof(a))#define debug(a) cout << #a << " = " << a <
> n ) { ans = 0; for(int i=0; i
> num; ans ^= num; } if( !ans ) cout << "B" << endl; else cout << "A" << endl; }}int main(){ input(); return 0;}

第三道:威佐夫游戏——黄金分割

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
 
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 2000000)
Output
共T行,如果A获胜输出A,如果B获胜输出B。
Input示例
33 53 41 9
Output示例
BAA
//Asimple#include 
//#define INF 0x3fffffff#define swap(a,b,t) t = a, a = b, b = t#define CLS(a, v) memset(a, v, sizeof(a))#define debug(a) cout << #a << " = " << a <
> T; while( T -- ){ cin >> n >> m; if( n>m ) { t = n; n = m; m = t; } t = floor((m-n)*(1+sqrt(5.0))/2); if( t == n ) cout << "B" << endl; else cout << "A" << endl; }}int main(){ input(); return 0;}

 

转载于:https://www.cnblogs.com/Asimple/p/7637715.html

你可能感兴趣的文章
Linux免密码登陆
查看>>
SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
查看>>
Socket & TCP &HTTP
查看>>
osip及eXosip的编译方法
查看>>
Hibernate composite key
查看>>
[CF Round #294 div2] D. A and B and Interesting Substrings 【Map】
查看>>
keepalived+nginx安装配置
查看>>
我的2015---找寻真实的自己
查看>>
android编译遇到问题修改
查看>>
解决Ubuntu18.04.2远程桌面Xrdp登录蓝屏问题
查看>>
Git的安装和使用教程详解
查看>>
lsof命令详解
查看>>
常用模块,异常处理
查看>>
父窗口与子窗口之间的传值
查看>>
eclipse 找不到 tomcat 的解决方案
查看>>
HDU 1890--Robotic Sort(Splay Tree)
查看>>
connection string for Excel/Access 2010
查看>>
【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
查看>>
学习wavenet_vocoder之环境配置
查看>>
常用Maven命令
查看>>