每天一道博弈论之“A funny game”(poj 2484)

题意:

  n枚硬币排成一个环,操作为可以选择相邻的两个取走(相邻指的是最开始相邻,即不会自动补成环)。问先手胜还是后手胜。

题解:

  首先我们考虑1和2,则明显是先手必胜。

  如果大于等于3,那么先手取后一定是一条链。这时我们一定可以把这一条链变成两条相等的链。(如果链长是奇数就取掉最中间的那个,否则取掉最中间的两个)。那么一个游戏就被分成了两个相同的独立游戏。那么假如对方在某一游戏中进行了一种操作,我们只要在另一游戏中重复该操作即可。那么可以保证我们面临的两个游戏状态一定相同,而对方面临的一定不同。显然终点是两个游戏中的硬币都被取完,即两游戏状态相同,而游戏又一定是会进行完的,所以当n大于等于3时后手必胜。

http://poj.org/problem?id=2484

原文地址:https://www.cnblogs.com/zub23333/p/8538343.html

时间: 2024-11-08 23:26:29

每天一道博弈论之“A funny game”(poj 2484)的相关文章

POJ 2484 A Funny Game(博弈)

题目地址:POJ 2484 很简单的智力题...当n>4时候,后手方完全可以根据剩下的奇偶情况使得剩下了偶数个并且对称,然后每当先手出一次,后手就可以模仿着先手在对称的地方出一次,这样的话,后方是必胜的. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.

POJ 2484

很明显地,我们知道,当N=1,2时,先手胜.当N=3时,可以把取走中间一个硬币,得到1,1.依然是先手胜.当N=4时,取走中间两点得到1,1,即先手依然取胜.当N=5时,取走中间1点,依然先手胜. 于是,当ALICE取走开头的硬币后,即得到一条链.那么,只需BOB把这条链平均分成两半,做对称操作,即可使ALICE必败. 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main(){

poj 2484 Cow Exhibition 【变形0-1背包】

题目:poj 2484 Cow Exhibition 题意:给出n头牛,每头牛有一个幸运值 si 和聪明值 ti ,现在要选出一些牛,让两个值的和最大,前提是sum(si)和sum(ti)都是非负值. 分析:此题数据量不大,可以暴搜+剪枝水过. 这里要说的是0-1背包的思想,这个题目明显的变形就是物品有两个属性值,而且都要选最大的. 那么我们可不可以把一个值固定下来来求另一个值的最大值,根据0-1背包的思想,定义状态:dp[i]表示装入一些物品使得sum(si)的时候最大的sum(ti)的值.

POJ 2484 A Funny Game 博弈论 对称博弈

http://poj.org/problem?id=2484 1和2时Alice必胜,3时Bob必胜,其他情况下Bob只需要在Alice取过之后取一次将剩下的硬币链平均分为两份,然后Alice怎么取Bob对称着取就可以了. 真是巧妙. 代码 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #i

每天一道博弈论之“逆序对游戏”

题目链接:https://loj.ac/problem/524 题意: 一开始有一个长度为n的序列,其中有的数是已知的(这些已知数两两不同),有些数是待填写的.操作为任选一个代填写位置填写一个未在序列中出现过的实数.无法填写时游戏结束.当游戏结束后若逆序对数目为奇数,则先手胜,否则后手胜. 题解: 其实有一个性质:若原序列逆序对数为奇数,你一定可以任选一个位置填写一个数使得逆序对数为偶数.反之亦然.(因为序列中的数是不重复的)尽量自己感性理解吧,十分严格的证明我也不会 所以若存在代填位置且为奇数

每天一道博弈论之“E&amp;D”

题意: 给你n组石子,每组有两摞.操作为选其中一摞石子分成两摞,抛弃原来同一组的另一摞石子,直到无法操作.问给你这n组石子,问先手胜还是后手胜. (比如(10,8,),你可以将10分为(5,5),那么这一组石子就成了(5,5),那个8就可以不用管了) 题目链接:https://www.luogu.org/problemnew/show/P2148 题解: 其实这道题我也不是很会,看了题解才写出来T_T 首先每组是独立的,可以求出每一组的SG值然后用SG定理解决. 那么每组的SG值怎么求呢? 好像

每天一道博弈论之“牛的数字游戏”

题意: 给你一个数n(n<=1e6),玩家可以进行的操作为减去该数最大数码或最小非零数码.即数2014可以减去1变成2013或减去4变成2010.将数变成0的一方赢. 题解: 直接求出1-1e6的SG函数值即可.复杂度O(n*lgn)(这里的log以10为底). #include<iostream> #include<cstdio> #include<cstring> #define LL long long #define RI register int usi

POJ 2484 A Funny Game(神题!)

一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而已,我想起刘汝佳的大白书上有类似的例题(不过复杂好多),于是便用同样的方法去做了,以sg(x)表示当前连续x个coin的状态的sg函数值,则当从左侧起分别取一个或相邻的两个时,不难得出其后继状态:sg(y)^sg(x-1-y)(0<=y<=(x-1)/2),sg(y)^sg(x-2-y)(0<

POJ 2484 A Funny Game(智商博弈)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6397   Accepted: 3978 Description Alice and Bob decide to play a funny game. At the beginning of the game they pick n(1 <= n <= 106) coins in a circle, as Figure 1 shows. A move consists i