zoukankan      html  css  js  c++  java
  • 博弈练习

    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
  • 相关阅读:
    loadrunner-3-19LR常见函数
    loadrunner-3-18Service-Level Agreement(服务水平协议)
    loadrunner-3-15IP欺骗
    loadrunner-3-14集合点
    Python 静态类型检查 mypy 示例
    JavaScript 中 == 和 === 的区别
    Python 一键安装全部依赖包
    TypeError: 'NoneType' object is not subscriptable
    前端开发神器 VSCode 使用总结
    Next.js 配置接口跨域代理转发
  • 原文地址:https://www.cnblogs.com/yyjxx2010xyu/p/5899474.html
Copyright © 2011-2022 走看看