题目:

A 和 B 在玩一个游戏,给定K个数字a1,a2,a3...ak ; 一开始有x个硬币 ; A 和 B 轮流取硬币。每次所取硬币的枚数一定在a1,a2,a3..ak ; 里面,A 先取 , 取走最后一枚的获胜 , 两个人都采取最优的策略,谁会WIN ?

分析:

博弈论的关键就在于找出必胜态 和 必败态 ;

1.既然取关了硬币就是获胜 , 那就是说到自己的时候没有硬币了,就是输了 ; 则j=0 ; 时是必败态 ;

2.如果对于某个i(1<=i<=k) , j-ai是传说中的必败态 , 那 j 就是必胜态 ; (当只有j枚硬币的时候 , 只要拿走a1枚对手就输了,那就是等于我赢了)

3.如果对于任意的i(1<=i<=k) , j-ai 都是必胜态,j就是必败态 ; (无论怎么取都是对手赢,那就是输)

难以理解的话,可以把 j 看成是当前的状态 , j-ai 是上一个状态 ; 这样可以找到j

依靠这些规则,采用动态规划的思想按照j从小到大的顺序计算必胜与必败 ; 到时我们只要看x是必胜还是必败即可 ;

#include<stdio.h>
int x,k,a[20001];
bool win[20001];
int main( )
{scanf("%d %d",&x,&k);for(int i=0 ; i<k ; i++)scanf("%d",&a[i]);win[0] = false;//到自己的时候没有了就输了;for(int j=1 ; j<=x ; j++){win[j] = false;for(int i=0 ; i<k ; i++){win[j] |=a[i]<=j && !win[j-a[i]];}}if(win[x])puts("A");elseputs("B");return 0;
}

自己敲的

#include<stdio.h>
int x,k,a[20001];
bool win[20001];
int main( )
{scanf("%d %d",&x,&k);for(int i=0 ; i<k ; i++)scanf("%d",&a[i]);win[0] = false;//到自己的时候没有了就输了;for(int j=1 ; j<=x ; j++){win[j] = false;for(int i=0 ; i<k ; i++){if(a[i]<=j){if(win[j-a[i]]==false)win[j]=true;}}}if(win[x])puts("A");elseputs("B");return 0;
}

题目:

意思就是两个人轮流拿硬币,Alice先拿,Alice拿的时候可以选择拿走一个或者拿走相邻的两个,谁拿完最后的石子胜利。

#include<stdio.h>
int main( )
{int n ;scanf("%d",&n);if(n<=2)puts("Alice");elseputs("Bob");return 0;
}

题目:

A 和 B 在玩游戏,给k个数字a1 , a2 , ... , ak ; 一开始有n堆硬币 , 每一堆有 xi 枚 。 A 和 B 轮流选出一堆硬币 ,从中取出硬币 , 每次所取硬币的枚数一定在a1 , a2 , a3 ,...., ak ; 里面,A先取,取光硬币的一方获胜 。

分析:这里引入一个概念 Grundy , 利用这个东西,很多游戏都可以转换为Nim>

只有一堆石头的情况

int grundy(int x){集合S={};for(j=1:k){if(a_j<=x) 将grundy(x-a_j)加到S集合中 } return 最小的不属于S的非负整数
}

rundy值:除(任意一步所能转移到 的状态  的Grundy值 )以外的最小非负整数,这样的Grundy值,和Nim中的一个石子堆类似,有如下性质:

mex{0,1,2}=3;mex{ 1, 2}=0 ; mex{ 2, 3}=1

1.Nim中有x颗石子的石子堆,能转移成有0,1,……,x-1堆石子的石子堆

2.从Grundy值为x的状态出发,可以转移到Grundy值为0,1,……,x-1的状态。

Nim:

所有石子堆的石子数xi的XOR

x1 XOR x2 XOR …XOR xk

为0必败,为1必胜

Grundy值等价于Nim中石子数,所以对于Grundy的情况:

所有硬币堆的Grundy的值

grundy(x1)  XOR  grundy(x2)  XOR …… XOR grundy(xn)

为0必败,为1必胜。

#include <cstdio>
#include <set>
#include <algorithm>
#define maxn 105
#define maxk 105
using namespace std;
int N,K,X[maxn],A[maxk];
int grundy[maxn+1];void solve(){//轮到自己剩0的时候必败 grundy[0]=0;            //计算grundy int max_x=*max_element(X,X+N);for(int j=1;j<=max_x;j++){set<int> s;                //存储当前的状态 for(int i=0;i<K;i++){if(A[i]<=j) s.insert(grundy[j-A[i]]);}int g=0;                //寻找当前状态的最小排斥 while(s.count(g)!=0) g++;grundy[j]=g;}    int ans=0;for(int i=0;i<N;i++) ans^grundy[X[i]];if(ans!=0)    puts("Alice");else puts("Bob");}int main(){scanf("%d%d",&N,&K);    for(int i=0;i<N;i++){scanf("%d",&A[i]);}for(int j=0;j<K;j++){scanf("%d",&X[j]);}solve();return 0;
} 

转载于:https://www.cnblogs.com/shuaihui520/p/9553259.html

硬币游戏 (博弈入门)相关推荐

  1. 浅谈 翻硬币游戏【Nim博弈】

    ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...

  2. JZOJ 1322. 硬币游戏

    Description FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C ...

  3. 【博弈入门】马丁· 奥斯本读书笔记

    文章目录 博弈入门 引论 理性选择理论 可理性化 严厉行动的逐次剔除 弱劣行动的逐次剔除 占优可解性 纳什均衡:理论 完全信息展开型博弈:理论 完全信息展开型博弈:例证 双寡头垄断的斯塔克伯格模型 完 ...

  4. JZOJ 1322 硬币游戏

    题目大意: FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C_i< ...

  5. JZOJ1322. 硬币游戏

    Description FJ的奶牛喜欢玩硬币游戏,所以FJ发明了一个新的硬币游戏.一开始有N(5<=N<=2,000)个硬币堆成一叠,从上往下数第i个硬币有一个整数值C_i(1<=C ...

  6. 《C++游戏编程入门(第4版)》——1.12 习题

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.1节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

  7. 2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进

    作业目的 Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币) ...

  8. 51nod 1381 硬币游戏 概率

    1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平 ...

  9. [Sdoi2017]硬币游戏 [高斯消元 KMP]

    [Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...

  10. 《C++游戏编程入门(第4版)》——1.8 Lost Fortune简介

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.8节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

最新文章

  1. dataframe for 循环 数据格式 python_Python中的for循环
  2. linux oracle em使用,案例:五步解决linux操作系统Oracle EM乱码的问题
  3. hive几种执行sql的方式总结
  4. 一文读懂哈希和一致性哈希算法
  5. JSON中的JSON.parseArray()方法、JSON.parseObject()方法和JSON.tojsonString()方法
  6. 【USACO 1.3】Ski Course Design
  7. 四、分布式账本技术对比
  8. Loadrunner11破解
  9. ue4设置组合键_UE4快捷键
  10. 用SPSS做数据分析(1)
  11. 心态-《自我成长的力量》书中的精髓:自我成长的过程需要我们不断觉察自己、改变自己、活出自己,从而成长为最好的自己。
  12. php阴阳万年历转换的接口,用php写的阴阳万年历
  13. FIL最新行情,FIL预测能涨至750U是否过于夸大?会突破新高吗?
  14. QGIS制作精美地图
  15. 加载.npz文件时,出现错误:OSError: Failed to interpret file ‘xxx.npz‘ as a pickle
  16. spfa已死???(bushi)
  17. python能在业余时间赚钱吗?分享自己的接私活经验及学习经验
  18. 激光SLAM:Livox激光雷达硬件时间同步
  19. 我用加强版RFM模型,轻松扒出B站优质up主!(含数据+实战代码)
  20. Qt获取本机IP、MAC地址、子网掩码、网卡名等函数设计

热门文章

  1. WinAPI: GetLocalTime、SetLocalTime、SetSystemTime - 获取与设置系统时间
  2. zabbix应用之获取监控项的graph曲线图
  3. 小布老师视频教程----oracle 9i 性能调优系列培训(全)
  4. 存储过程 psal emp.sal%type是什么意思
  5. JS实现图片放大查看
  6. MongoDB9高可用的MongoDB集群
  7. 【笔记】js Function类型 内部方法callee
  8. javascript eval函数解析json数据时为什加上圆括号eval((+data+))
  9. Mac OS X Yosemite安装盘U盘制作
  10. openfire 插件开发