ACM 博弈专题(5种模板)

最近算法课在学博弈论的知识,顺手把算法题中的涉及到博弈论一并总结了
这篇文章的有些内容是参考了大佬的
可能有遗漏。。。。
(一)巴什博弈(BAsh Game)

题目模板

  • 只有一堆n个物品
  • 两个人轮流取,每次只能取1~m个物品,谁先取完,谁胜利;(n,m是输入的随机数)

解题思路

  1. 当 n = m + 1 时 第一个取的人不可能获胜;
  2. •当 n = k*(m + 1) + r 时           (k,r,s都是未知的整数)

•当 n = k*(m + 1) + r 时 (k,r,s都是未知的整数)

•先取者拿走 r 个,那么后者再拿(1~m)个

• 此时 n =(k-1)*(m+1)+s

•先取者再拿走s 个 最后总能造成 剩下n=k*(m+1) 的局面

•若n=k*(m+1) 那么先取者必输

若n=k*(m+1) 那么先取者必输

求解巴什博弈函数

  1. int Bash_Game(int n,int m)//是否先手有必赢策略
  2. {
  3. if (n%(m+1)!=0)
  4. return 1;
  5. return 0;
  6. }

样题:HDU 2147 kiki's game            HDU 2149 Public Sale          HDU 1846 Brave Game       HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者

 

 

(二)威佐夫博奕(Wythoff's game)

题目模板

  • 有两堆各若干个
  • 两个人轮流从某堆或同时从两堆取同样多的物品
  • 规定每次至少取一个,多者不限,最后取光的人胜利

解题思路

  • 两堆石子的状态为 [a,b] (满足a<=b)
  • 当 a=(k*(√5+1)/2), b=a+k 时满足奇异局势,那么则先手输,反之则先手赢

求解威佐夫博奕函数

  1. int Wythoff_Game(int a,int b)//b要大于a
  2. {
  3. double x=(1+sqrt(5))/2;
  4. int n=b-a;
  5. if(a==(int)(x*n))
  6. return 1;
  7. return 0;
  8. }

样题:HDU 1527 取石子游戏           HDU 2177 取(2堆)石子游戏

 

 

(三) 尼姆博奕(Nimm's Game)

题目模板

  • 有多堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

解题思路

  • 用0与每个数异或,如最后结果为0,则后手胜

  • 设一数组a[n][m],令sum=0

  • 循环与数组每一个数据异或(sum^=a[i][j])

  •  sum最后等于0则后手胜

​​​​​​​求解尼姆博弈函数

a[m]每堆物品的数量  sum=0

  1. int Nimm_Game(int n,int m)//n堆物品,m个物品
  2. {
  3. for(int i=0;i<n;i++)
  4. for(int j=0;j<m;j++)
  5. sum = sum ^ a[i][j];
  6. if(sum == 0)
  7. return 0;
  8. return 1;
  9. }

样题:HDU 1850 Being a Good Boy in Spring Festival

           HUD 1907 John        HDU 2509 Be the Winner

           HDU 1849 Rabbit and Grass

 

 

(四) 斐波那契博弈

题目模板

  • 有一堆个数为n的石子,游戏双方轮流取石子,
  • 满足:
  • 先手不能在第一次把所有的石子取完;
  • 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)

求解斐波那契博弈函数 f[50]

  1. int Fib_Game(int n)
  2. {
  3. f[1]=1;f[2]=1;
  4. for(int i=3;i<=50;i++)
  5. f[i] = f[i-1] + f[i-2];
  6. if( 数组f 中包含 n )
  7. return 1;//先手赢
  8. return 0;
  9. }

样题:HDU 2516 取石子游戏

 

 

(五) 环形博弈

题目模板

  • n个石子围成一个环,每次取一个或者取相邻的2个(每个石子有序号)

​​​​​​​求解

  • 石子数<=2先手赢,否则后手赢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让sky Driver成为你的可见硬盘

网盘就不用多说了&#xff0c;国内国外的都很多&#xff0c;但是sky Driver以25G的大容量还是吸引着我&#xff0c;看来还是盖茨比较称钱&#xff08;sorry&#xff0c;方言&#xff0c;意思就是nb的意思&#xff09;&#xff0c;但是一向以用户体验非常不错著称的microsoft在这…

初学博弈论

一、巴什博奕(Bash Game) 基本描述&#xff1a; 只有一堆n个石子&#xff0c;两个人轮流从这堆石子中取石子&#xff0c;规定每次至少取一个&#xff0c;最多取m个&#xff0c;最后取完的人获胜。 分析&#xff1a; 当n < m的时候&#xff0c;显然先手获胜&#xff0c;因…

设计模式----Adapter(适配器)

作用: 将一个类的接口转换成客户希望的另外一个接口。Adapt 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 UML示意图 1)采用继承原有接口类的方式 2)采用组合原有接口类的方式 解析: Adapt模式其实就是把完成同样的一个功能但是接口不能兼容的类桥接在一起…

浅谈算法——博弈论

注&#xff1a;下列游戏都建立在双方都有最优策略的情况下&#xff0c;若未加以说明&#xff0c;则每人每次至少取一个石子。 例1&#xff1a;取石子游戏之一 有两个游戏者&#xff1a;A和B。有n颗石子。 约定&#xff1a;两人轮流取走石子&#xff0c;每次可取1、2或3颗。A先…

linux系统管理学习笔记之八---进程与作业的管理

linux系统管理学习笔记之八---进程与作业的管理 2010-01-05 13:00:42标签&#xff1a;linux 进程    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。ht…

C++中的srand(time(null))利用时间设置随机种子产生随机数

首先需要声明的是&#xff0c;计算机不会产生绝对随机的随机数&#xff0c;计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数&#xff0c;即使计算机怎样发展&#xff0c;它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数&#xff0c;即伪…

srand(设置随机数种子)

srand&#xff08;设置随机数种子&#xff09; 相关函数rand&#xff0c;random srandom 表头文件#include<stdlib.h> 定义函数void srand (unsigned int seed); 函数说明srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数&#xff0c;通常可以利用g…

Exchange 2003升级至Exchange 2007

环境: 三台机器:DC Exchange2003 Exchange2007 计算机名:DC MAIL NEWMAIL 前提条件: 1.Exchange组织设置为纯模式。 2.Exchange 2003安装SP2 3.拥有Schema Master角色的DC及所有GC运行在Windows 2003 SP1或更高以上 4.AD域提升到最高 不被Exchange 2007支持的组件有: Nov…

蓝桥杯 标题:纵横火柴旗子

【编程题】这是一个纵横火柴棒游戏。如图[1.jpg]&#xff0c;在一个3x4的方格中&#xff0c;游戏的双方轮流放置火柴棒。其规则是&#xff1a;1. 不能放置在已经放置火柴棒的地方&#xff08;即只能在空格中放置&#xff09;。2. 火柴棒的方向只能是垂直或水平放置。3. 火柴棒不…

易语言源代码毁来者来了!!

2009年12月7号16:34分&#xff0c;恐怖现象在次出现了&#xff01; 在编译易程序时&#xff0c;突然提示&#xff0c;某某模块找不到了&#xff0c;我跑到软件目录下一看&#xff0c;妈啊不得了&#xff0c;目录中一百多个文件能删除的全部都被删除了&#xff0c;只剩余几个残破…

矩阵连乘 动态规划 详解

矩阵连乘问题----动态规划(转载)&#xff1a; 给定n个矩阵&#xff5b;A1,A2,…,An&#xff5d;&#xff0c;其中Ai与Ai1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。如何确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少。…

网上威客的猫腻

近期在威客网上转了转 在国内的几大威客&#xff08;任务中国 taskcn,项目交易网sxsoft&#xff09;等上看了看 发现那竞标人真是多啊 经过一两次尝试&#xff08;想弄点小零花钱嘛&#xff09; 发现其中还真有不少猫腻 这里重灾区就是项目交易网 www.sxsoft.com 该网站是北京一…

php中mysql_connect与mysql_pconnect的区别

前阵子去面试被问到了mysql_connect跟mysql_pconnect的区别, 很不幸本人只答出一条, 似乎还没被认可~回来翻了下php手册记录之.简单的来说mysql_pconnect是用来在php与mysql间建立一条持续连接, 一般php的执行模式是脚本开始执行时初始化所有资源, 脚本运行结束后释放所有资源.…

软件测试-白盒测试(六种覆盖准则)

白盒测试过程中&#xff1a; 六种覆盖方法中&#xff1a;覆盖强度由弱到强的顺序依次是&#xff1a; 语句覆盖判定逻辑覆盖条件逻辑覆盖‘判断逻辑条件覆盖条件组合覆盖路径覆盖 举例&#xff1a; if(a&&b) {cab; } else {ca-b; }12345678 1.语句覆盖&#xff1a;…

Linux 的mv命令

命令格式:mv a b 总结起来有以下几种情况: a是文件名,b不存在 a改名为b。 a是文件名,b是文件名 a改名为b,原b被覆盖。 a是文件名,b是目录名,b下没有名为a的文件或目录 a移动到b目录下。 a是文件名,b是目录名,b下没有…

白盒测试中的六种覆盖方法及案例分析

语句覆盖是指选择足够的测试用例&#xff0c;使得运行这些测试用例时&#xff0c;被测程序的每一个语句至少执行一次&#xff0c;其覆盖标准无法发现判定中逻辑运算的错误&#xff1b;判定覆盖<又叫分支覆盖率>是指选择足够的测试用例&#xff0c;使得运行这些测试用例时…

回文数的C语言表述

2019独角兽企业重金招聘Python工程师标准>>> 现在的程序针对范围是0开始。直到溢出 #include #includemain(){ int i; /*本人的电脑用long和int一样*/for(i0;i<500;i){ if(svalue(i)) printf("%3d,",i); }getch();} int sv…

别人的爬虫在干啥

古人云博采众长&#xff0c;我们来看看其他人的爬虫是怎么学和用的&#xff1a; 爬虫文章 in 简书程序员专题&#xff1a; like:128 - Python 爬取落网音乐 like:127 - 【图文详解】python爬虫实战——5分钟做个图片自动下载器like:97 - 用Python写一个简单的微博爬虫like:87 …

windowsXP/7下消除快捷键箭头的方法

1.修改注册表。&#xff08;1&#xff09;启动注册表编辑器&#xff1a;点击 开始—运行里面输入“regedit”&#xff08;2&#xff09;然后依次展开如下分支&#xff1a;“HKEY_CLASSES_ROOT\lnkfile”&#xff1b;删除“lnkfile”子项中的“IsShortcut”字符串值项注意&#…

LVM( Logical Volume Manager )配置案例(on RHEL4)

LVM( Logical Volume Manager )配置案例(on RHEL4) 一 LVM配置步骤 1.准备一个分区 fdisk /dev/hda (或/dev/sda) 本案例中创建的分区为/dev/hda15 2.创建PV pvcreate /dev/hda15 如果有多少分区/dev/hda15,/dev/hda16&#xff0c;/dev/hda17,则可以 pvcreae /dev/hda1[5-7] 3.…