博弈论(取石子专题)
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1066
必胜策略:令 n = (k + 1) * r + s ; A第一次取s个,让B面对k+1倍数的局面,如果B取m个则A取k+1 - m个。
#include <cstdio>
#include <cstring>
using namespace std;int main()
{int t;scanf("%d", &t);while( t-- ){int n, k;scanf("%d%d", &n, &k);if( n <= k )printf("A\n");else{int tmp = n % (k + 1);if( tmp == 0 )printf("B\n");elseprintf("A\n");}}return 0;
}
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次只能拿1,3,4颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1067
分析:连续找一些书测试,可以发现当 n % 7 == 0 || == 2 时B胜,其余情况A胜
#include <cstdio>
using namespace std;int main()
{int t, n;scanf("%d", &t);while( t-- ){scanf("%d", &n);int tmp = n % 7;if( tmp == 0 || tmp == 2 )printf("B\n");elseprintf("A\n");}return 0;
}
有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N及每堆石子的数量,问最后谁能赢得比赛。
例如:3堆石子,每堆1颗。A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子。
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069
分析:尼姆博弈,对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算.
#include <cstdio>
using namespace std;int main()
{int n;while( ~scanf("%d", &n) ){int ans = 0;int num;for( int i=0; i<n; i++ ){scanf("%d", &num);if( i == 0 )ans = num;elseans ^= num;}if( ans != 0 )printf("A\n");elseprintf("B\n");}return 0;
}
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1072
分析:威佐夫博弈
两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜. 局势(N,M)(N<M)满足
N==(int)((1.0+sqrt(5.0))/2.0*(M-N))时,该局势为奇异局势,后拿者必胜.
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;int main()
{int t;scanf("%d", &t);while( t-- ){int a, b; // n mscanf("%d%d", &a, &b);if( a > b )swap(a, b);int tmp = (int) ((1.0 + sqrt(5.0)) / 2.0 * (b - a)); // 奇异局势if( a == tmp )printf("B\n");elseprintf("A\n");}return 0;
}
博弈论(取石子专题)相关推荐
- bzoj3895: 取石子(博弈论,记忆化搜索)
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MB Submit: 361 Solved: 177 [Submit][Status][Discuss] ...
- POJ1067 取石子游戏 跪跪跪,很好的博弈论
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29951 Accepted: 9814 Descriptio ...
- 【一本通】1218:取石子游戏(博弈论)
题目描述: 有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍,最后谁能够把一堆石子取空谁就算赢. 比如初始的时候两堆石子的数目是25和7 ...
- 【POJ】1067 取石子游戏(博弈论)
Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- 博弈论——1218:取石子游戏
1218:取石子游戏时间限制: 1000 ms 内存限制: 65536 KB 提交数: 10430 通过数: 4939 [题目描述] 有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取 ...
- 取石子游戏,程序员用博弈论教你如何必胜
1.游戏规则 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子(至少取1个). 每次有两种不同的取法,规则如下: 1.一是可以在任意的一堆中取走任意多的石子:2.二是可以在两堆中同时取走相同 ...
- 博弈论之取石子游戏的学习
以下内容来自转载: 博弈问题简介 所讨论的博弈问题满足以下条件: 玩家只有两个人,轮流做出决策 游戏的状态集有限,保证游戏在有限步后结束,这样必然会产生不能操作者,其输 对任何一种局面,胜负只决定于局 ...
- 博弈论——《取石子》《取石子游戏》
传送门:活动 - AcWing 思路: 结论:在所有堆的石子个数>1的情况下 只要石子数+石子堆数-1==b是奇数,那么先手必胜.b是不计算所有个数为1的石子堆得出的. b是奇数的情况下一定存在 ...
- NYOJ 23 取石子(一)
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的 ...
- POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...
最新文章
- Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别
- Neuron 2020 | 深度强化学习和神经科学
- python3生成avi文件
- qsort函数应用大全
- uwsgi: error while loading shared libraries: libicui18n.so.58: cannot open shared object file
- jQuery 源码分析笔记(3)
- [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones
- 反射机制 Class.getDeclaredMethod
- gcc(g++)头文件搜索路径与库文件搜索路径(转载)
- php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小
- 10月18号、19号、20号三天PC端云音乐项目总结
- AIC和BIC准则详解
- html2d缩放代码,HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
- LayUi 之 模板引擎
- SDN控制平面(五)
- 百度搜索研究,详解一个页面的索引价值!
- 推挽输出、漏极输出方式详解
- 软件开发工程师最重要的4项技能
- xp系统简单tcpip服务器,xp系统没有tcpip协议怎么办,xp安装tcpip协议的方法
- 很有意思的思维方式:直线思维和曲线思维