ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

博弈论 _ SG函数

2022-09-10 22:33:01  阅读:164  来源: 互联网

标签:return 函数 int sg 博弈论 cin ans SG


定义

SG函数是指:在有向图中,对于每个节点x,设从 \(x\) 出发共有\(k\)条有向边(直接相连的边),分别达到节点\(y_1,y_2……y_k\),
定义\(SG(x)\)为\(x\)的后继节点的\(SG\)值构成的集合执行\(mex()\)运算后的值

\(mex():\)设集合S是一个非负整数集合,mex(S)就是求不属于S的最小非负整数。

证明理解

定理:
对于一个图GG,如果SG(G)!=0SG(G)!=0,则先手必胜,反之必败

证明:
若SG(G)=!0SG(G)=!0,
1.根据性质2,先手必可以走向0,
2.因此留给后手的是0,根据性质3,后手只能走向非0
3.以此类推,后手始终无法走向0,后手永远处于非0,当先手到达终点的0时,先手获胜
(由此我们可以知道,有些事是命中注定的~~~)
反之同理,必败

模板代码


#include<bits/stdc++.h>
#define int long long
#define pdd pair<double ,double >

using namespace std;
const int N = 110, M = 10010;
int n,m;
int s[N], f[M];
int sg(int x){
  if(f[x]!=-1) return f[x];
  
  unordered_set<int> S;
  for(int i=0;i<n;i++)
  //如果可以减去s[i],则添加到S中
    if(x>=s[i]) S.insert(sg(x-s[i]));

  //求mex(),即找到最小并不在原集合中的数
  for(int i=0; ; i++)
    if(!S.count(i)) return f[x]=i;
}
void solve(){
   cin>>n;
   for(int i=0;i<n;i++) cin>>s[i];
   memset(f,-1,sizeof f);
   cin>>m;
   int ans=0;
   while(m--){
    int x;cin>>x;
    ans^=sg(x);
   }
   if(ans) puts("Yes");
   else puts("No");
} 

signed main(){
  int t=1;
  // cin>>t;
  while(t--)
  solve();
  return 0;
}

模板题

893. 集合-Nim游戏

题意
给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S。

现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S,最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入样例

2
2 5
3
2 4 7

输出样例

Yes

代码


#include<bits/stdc++.h>
#define int long long
#define pdd pair<double ,double >

using namespace std;
const int N = 110, M = 10010;
int n,m;
int s[N], f[M];
int sg(int x){
  if(f[x]!=-1) return f[x];

  unordered_set<int> S;
  for(int i=0;i<n;i++)
  //如果可以减去s[i],则添加到S中
    if(x>=s[i]) S.insert(sg(x-s[i]));

  //求mex(),即找到最小并不在原集合中的数
  for(int i=0; ; i++)
    if(!S.count(i)) return f[x]=i;
}
void solve(){
   cin>>n;
   for(int i=0;i<n;i++) cin>>s[i];
   memset(f,-1,sizeof f);
   cin>>m;
   int ans=0;
   while(m--){
    int x;cin>>x;
    ans^=sg(x);
   }
   if(ans) puts("Yes");
   else puts("No");
} 

signed main(){
  int t=1;
  cin>>t;
  while(t--)
  solve();
  return 0;
}

标签:return,函数,int,sg,博弈论,cin,ans,SG
来源: https://www.cnblogs.com/kingwz/p/16679003.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有