博弈练习

1.有N(N<=1000)个贪婪的海盗,他们得到了100,000个金币,决定分赃。他们都很精明,都想自己利益最大化,并采取如下策略: 1、 首先N人排好次序。 2、 由编号最大者给出分赃方案。 3、 所有人表决,50%及以上的人赞成就分赃成功,否则转4。 4、 杀掉提案者(总人数少了1),转2。  你的任务:判断第几号海盗得最多金币,有多少个。

Sol:有n个人的策略都源于有n-1个人的策略,即这个人的获利比n-1的时候获利高,就会赞成

n=1 1:100000

n=2 1:0 2:100000

n=3 1:1 2:0 3:99999

n=4 1:0 2:1 3:0 4:99999

n=5 1:1 2:0 3:1 4:0 5:99998

................

找规律可得答案为n 100000-(n-1)/2

2.Stan和Ollie在玩一个乘法游戏。游戏的每一轮需要将2~9中的某一个数字和已得的数p乘起来。Stan总是从p=1开始乘,然后是Ollie,轮流。在开始前他们约定,首次使p>=N(1 < N < = 1000000)的人获胜。假定每人都采取最优策略。

Sol:某个人取到n/9>p时就赢了,那么为了n/(2*9)<p<n/9是另一个一个人赢,会发现以18为周期小于9,大于9讨论即可.

3.有N(1<=N<=100)堆石子,每堆个数给定A1..AN(1<=Ai<=2,147,483,647),现有甲乙两人轮流取石子,由甲开始,每次选一堆,取走一定数目石子,1到Ai的一半取下整,如Ai=5时,可取1或2,Ai=6时,可取1或2或3,但Ai=1不能取。不能取者负,求甲是否获胜。假定每人都采取最优策略。 Hint:只需算出每堆石子的SG值g(i),再按照Nim游戏方案进行计算。

Sol:先后暴力找到SG函数,然后找规律

    if (x%4==0) return x/2;

    if (x%4==2) return x/2;

    if (x%4==1) return x/4;

    if (x%4==3) return Sg(x/2);

4.他们规定在一个有向无环图上有N个棋子,参赛者可以将一个棋子沿着边的方向进行移动,但是一次只可以移动一步,到棋子都移动到出度为0的顶点时就不能再移动,此时无棋可走的参赛者就算输。假若参赛双方都足够聪明,当然,都没有机房Master 绅士LJ 聪明,请问无耻的peter是否存在必胜策略。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 const int Maxn=200100;
 7 const int Maxm=1000010;
 8 struct EDGE {int to,next;}edge[Maxm<<1];
 9 int head[Maxn],Sum,n,x,cnt,Sg[Maxn],t;
10 bool vis[Maxn],H[Maxn];
11 inline void Add(int u,int v)
12 {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
13 void Dfs(int u)
14 {
15     vis[u]=true;
16     int Cnt=0;
17     for (int i=head[u];i!=-1;i=edge[i].next) Cnt++;
18     for (int i=head[u];i!=-1;i=edge[i].next)
19         if (!vis[edge[i].to]) Dfs(edge[i].to);
20     for (int i=0;i<=Cnt;i++) H[i]=false;
21     for (int i=head[u];i!=-1;i=edge[i].next)
22         if (Sg[edge[i].to]<=Cnt) H[Sg[edge[i].to]]=true;
23     for (int i=0;i<=Cnt;i++)
24         if (!H[i])
25         {
26             Sg[u]=i;
27             return;
28         }
29 }
30 int main()
31 {
32     // freopen("c.in","r",stdin);
33     scanf("%d",&n);
34     memset(head,-1,sizeof(head));
35     for (int i=0;i<n;i++)
36     {
37         scanf("%d",&Sum);
38         for (int j=1;j<=Sum;j++)
39         {
40             scanf("%d",&x);
41             Add(i,x);
42         }
43     }
44     memset(vis,false,sizeof(vis));
45     for (int i=0;i<n;i++)
46         if (!vis[i]) Dfs(i);
47     while (scanf("%d",&t)!=EOF)
48     {
49         int Ans=0;
50         for (int i=1;i<=t;i++)
51         {
52             scanf("%d",&x);
53             Ans=Ans^Sg[x];
54         }
55         if (Ans) puts("WIN"); else puts("LOSE");
56     }
57     return 0;
58 }

Sg

时间: 2024-10-06 13:38:55

博弈练习的相关文章

苹果不再“雁过拔毛”的背后:利益博弈下谁是赢家?

自从库克成为苹果大当家后,苹果似乎就一直奔着利润一股脑地扎进去了.iPhone万年不变样,就连有所改变的iPhone X在售价上也是"穷凶极恶",吃相极其难看.而在今年4月份腾讯微信官方发布通告,更是将苹果推上风口浪尖.微信官方表示,由于受苹果公司新规定影响,iOS 平台的微信客户端关闭公众号打赏功能. 至于微博问答.知乎问答.今日头条及众多直播平台等在内,都逃不过苹果的"雁过拔毛"--苹果认为应用上的打赏属于"内购"行为,去抽取30%的分成.但

HDU1760 A New Tetris Game【DFS】【博弈】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1760 题目大意: 给你一个N*M的矩阵棋盘.数字0代表该位置可用,数字1代表该位置不可以.Lele和姐姐在这个 棋盘上下棋,每次在棋盘上放一个大小为2*2的正方形,棋子间不能相互叠加.两个人轮流放,每 次都按最优策略放正方形.轮到谁没有地方放置棋子了,就算谁输.若每次都是Lele先放,那么问 题来了:Lele是否一定能赢姐姐呢. 思路: 博弈中的必胜态:当前所能到达的状态能到达一个必败态,则当前状

HDU 3980 Paint Chain(博弈 SG)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3980 Problem Description Aekdycoin and abcdxyzk are playing a game. They get a circle chain with some beads. Initially none of the beads is painted. They take turns to paint the chain. In Each turn one p

博弈问题-Alice与Bob拿牌游戏

Description Bob and Alice play a game, and Bob will play first. Here is the rule of the game: 1) There are N stones at first; 2) Bob and Alice take turns to remove stones. Each time, they can remove p^k stones. p is prime number, such as 2, 3, 5, ...

51nod 1066 Bash游戏 V2 博弈

1067 Bash游戏 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3,4颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N,问最后谁能赢得比赛. 例如N = 2.A只能拿1颗,所以B可以拿到最后1颗石子. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行1个

51nod 1068 Bash游戏 V3 博弈

1068 Bash游戏 V3 题目来源: Ural 1180 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量只能是2的正整数次幂,比如(1,2,4,8,16....),拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N,问最后谁能赢得比赛. 例如N = 3.A只能拿1颗或2颗,所以B可以拿到最后1颗石子.(输入的N可能为大数) Input 第1行:一个

51nod_1490: 多重游戏(树上博弈)

题目链接 该题实质上是一个树上博弈的问题.要定义四种状态--2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必胜态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的所有儿子都是先手必胜态,则该结点为先手必败态: 若某结点的儿子既有先手必胜态,又有先手必败态,或者是存在不能控制态,则该状态为可输可赢: 若某节点的所有儿子都是可输可赢态,则该结点为不能控制态. #include<bits/stdc++.h> using namespace std; typede

Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)

之前在bc上做过一道类似的阶梯博弈的题目,那题是移动到根,这题是移动到叶子.换汤不换药,只要和终态不同奇偶的那些位置做nim即可.因此这题给出了一个条件:所有叶子深度的奇偶性相同.同时需要注意的是,上次bc中,根节点是不能移动的,因此根节点是终态节点,而这里叶子上面还可以进行操作(可以吃掉),那么就相当于叶子节点都还可以继续向下移动,因此他们不是终态节点,也就是说这题只要和叶子节点同奇偶的做nim即可. 因此,如果nim和已经是0,已经可以满足先手必输了,而题目说了必须要交换,那么只要让奇偶性相

hdu2174 kiki&#39;s game 博弈

Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of the chesserboard is n*m.First of all, a coin is placed in the top right corner(1,m). Each time one people can move the

【Bzoj3609】[Heoi2014]人人尽说江南好(博弈)

先pia代码 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int n,a,b; 5 cin>>n; 6 for(int i=0;i<n;i++){ 7 cin>>a>>b; 8 int c=a/b;int d=a%b;//c代表最多分成c份b堆.d代表剩下的那一堆最多为多少 9 if(d==0) d++;//如果根本没有剩下的,那就把d+1,使ans的值不会错~ 10 int