今天闲来无事,不想刷codeforces了,到洛谷提高组训练营找几道水题刷着玩玩(虽然自己早已过了打OI的年纪)~

简单博弈论专题

P1199 三国游戏

这么考虑,由于电脑总是不能让我搭配出当前能搭配出的最大的组合,也就是说我不管选哪个英雄,都不可能匹配出该英雄能搭配出的最大的默契值,那么我最大能搭配出的默契值就是所有英雄匹配中,次大默契值的最大值。
假设有a、b、c、da、b、c、da、b、c、d四位英雄
aaa能匹配的最大值为aM" role="presentation" style="position: relative;">aMaMa_{M}次大值为amama_m
bbb能匹配的最大值为bM" role="presentation" style="position: relative;">bMbMb_{M}次大值为bmbmb_m
ccc能匹配的最大值为cM" role="presentation" style="position: relative;">cMcMc_{M}次大值为cmcmc_m
ddd能匹配的最大值为dM" role="presentation" style="position: relative;">dMdMd_{M}次大值为dmdmd_m

假设其中am>bm>cm>dmam>bm>cm>dma_m>b_m>c_m>d_m

那么我能得到的最大可能值也就是amama_m了。
下面证明,电脑能组合出的最大值一定比amama_m要小。
那么我一开始选择aaa,电脑一定会选择与a" role="presentation" style="position: relative;">aaa能形成aMaMa_M的值的英雄,假设是ddd。
然后我再选c" role="presentation" style="position: relative;">ccc,这里假设c与a组合得到amc与a组合得到amc与a组合得到a_m。
那么电脑会选择bbb。
反证法开始了:
假设d与b形成的默契值t>am>dm" role="presentation" style="position: relative;">d与b形成的默契值t>am>dmd与b形成的默契值t>am>dmd与b形成的默契值t>a_m>d_m
而d与a形成的默契值为aM>am>dmd与a形成的默契值为aM>am>dmd与a形成的默契值为a_M>a_m>d_m
这样的话dmdmd_m不可能是ddd能匹配到的次大值,矛盾。
所以t&lt;am" role="presentation" style="position: relative;">t<amt<amt 本次电脑不会选择到比amama_m更大的数。
随后我们只需要破坏掉电脑构造成最大的组合就可以了。

P1288 取数游戏II

如果出发点靠着0边,那么只能往一个方向走,并且走过的边的值一定要减到0,不然对面会逆过来,然后把边减到0,这样我方就输了。

不靠0边的时候,如果沿着某个方向走会赢,那么就把沿路经过的边设置为0。
如果沿着那个方向走都不会赢,你任取一个方向走的时候不把边设置为0,对方在下一次走的时候也会继续沿着这个方向,并把下一条边设置成0,你还是要一直沿着这个方向走。

所以不管怎么样,经过的边都会变成0,也就是说一旦选定方向了,就只能一直走。
所以结果很固定,你只要把2个方向都老老实实沿着走下去,有一种情况能赢就能赢,否则就不能赢。

P1290 欧几里德的游戏

典型的辗转相除法。

假设这时候状态是(a,b)满足a>b(a,b)满足a>b(a,b) 满足 a>b
如果[a/b]=1[a/b]=1[a/b] = 1那么(a,b)(a,b)(a,b)与(b,a%b)(b,a%b)(b,a\%b)的状态是相反的。
如果[a/b]=k>1[a/b]=k>1[a/b] = k > 1那么就是必胜的,因为如果(b,a%b)(b,a%b)(b,a\%b)是必败态,那么a直接剪去k个b,否则的话,a剪去k-1个b。很简单是不是。

P2148 [SDOI2009]E&D

山东的省选题,中规中矩。
由于多个组是独立游戏,所以Nim博弈,直接求出所有组的sg函数,然后异或就可以了,如果异或值为0则必败,否则必胜。
由于每个二元组(a,b)(a,b)(a,b)的范围都是1e91e91e9,这样的话,sg函数的复杂度太大了,所以要想想办法。
方法就是:打表找规律!2333
规律如下:

int sg(int x,int y){if(x == 1 && y == 1)return 0;if(x%2 && y%2)return 0;if(x%2) swap(x,y);if(y%2 == 0){return sg(x/2,y/2)+1;}else{return sg(x,y+1);}
}

P1247 取火柴游戏

简单的不像话,跟上面的题难度一样,方法也一样,求sg函数,然后异或。
不同的地方是,这个要求第一步的方案。

在必胜态的时候,异或得到的值为ans。
我们第一步要做的就是拿掉一堆中的某些火柴,然后使异或值变为0。
假设我们要拿掉第i堆的某些火柴,那么这一堆应该剩下的火柴的数目就是ansansans xor n[i]n[i]n[i],拿走的火柴数目就是n[i]−n[i]−n[i] - (ansansans xor n[i]n[i]n[i])。
从小到达枚举堆数,找一个合法的情况就好了。

P2575 高手过招

这到也是sg函数➕异或。
不得不说sg函数是博弈论的大杀器呀。
求sg函数的方法就不说了,注意的点:

代码

#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
#include <unordered_map>
using namespace std;
const int maxn = 2e6;
int T,n,m;
int sg[maxn];
int grundy(int status){if(sg[status] != -1)return sg[status];unordered_map<int,int> mp;for(int i = 19;i > 0;--i){if(!(status&(1<<i))) continue;int j = i-1;for(;j >= 0;--j)if(!(status&(1<<j)))break;if(j == -1) continue;mp[grundy(status ^ ((1<<i) + (1<<j)))] = 1;;}for(int i = 0;;i++){if(!mp[i])return sg[status] = i;}
}
int main(){cin>>T;memset(sg,-1,sizeof(sg));while(T--){scanf("%d",&n);int ans = 0;for(int i = 1;i <= n;++i){scanf("%d",&m);int status = 0;for(int j = 1;j <= m;++j){int p;scanf("%d",&p);status |= 1<<(20-p);}ans ^= grundy(status);}if(ans) puts("YES");else puts("NO");}return 0;
}

闲来无事刷水题、简单博弈论专题、sg函数、洛谷相关推荐

  1. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  2. 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数

    文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...

  3. 博弈论与SG函数(Nim游戏)

    博弈论与SG函数(Nim游戏) 目录 博弈论与SG函数(Nim游戏) 游戏状态 状态图(SG图) Nim 游戏 Nim 和 SG函数 Grundy数字 组合博弈游戏 Grundy 游戏 例题 在本篇, ...

  4. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

  5. 图论刷水题记录(一)(最短路-----dijkstra算法)

    最近实在不知道干些什么,感觉自己除了水题什么都不会做,算了去刷一刷图论的水题吧本来想合起来一起发,想了想太长的话以后看起来也不方便,题目所以今天晚上就先发了dij部分,由上到下由易变难. 1.POJ ...

  6. LeetCode 59. 螺旋矩阵 II [水题+简单模拟]

    前言: 最近要准备硕士研究生入学复试,还要机试,所以又开始刷一些题了. 太久没刷题了,本来就菜,现在变得更菜了-- 题面: 吐槽:题目来自LeetCode,难度标识为"中等",有点 ...

  7. Cow Digit Game(博弈论:sg函数)

    链接:https://ac.nowcoder.com/acm/contest/1071/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  8. 博弈论与sg函数入门

    记录一点结论性的东西,推导见百度吧. 首先博弈的前提是双方"绝对理智". 一般的胜负博弈游戏来说,有以下几点:(注意必胜必败是针对这回合操作的人) 所有终结状态为必败点(比如五子棋 ...

  9. 博弈论与 sg 函数

    博弈论 定义 必胜状态 为 先手必胜的状态 , 必败状态 为 先手必败的状态 . 通过推理,我们可以得出下面三条定理: 定理 1:没有后继状态的状态是必败状态. 定理 2:一个状态是必胜状态当且仅当存 ...

最新文章

  1. MVC案例-架构分析
  2. k近邻算法之 k值的选择
  3. Android线程实例讲解
  4. 计算机算法设计与分析二--分治
  5. 如何使用用户数据脚本在EC2实例上安装Apache Web Server
  6. Streams API
  7. 【转载】【凯子哥带你学Framework】Activity界面显示全解析(下)
  8. chaincode java_基于Hyperledger Fabric交易系统帐户的钱包模型的java Chaincode实例
  9. UML(统一建模语言)
  10. Rayman的绝顶之路——Leetcode每日一题打卡14
  11. 1004-史丰收速算
  12. Boundary loss for highly unbalanced segmentation
  13. 提取DWI数据的FA和MD
  14. 敏捷团队︱数字化领导力之敏捷团队建设
  15. erdas图像增强步骤_ERDAS图像增强处理.ppt
  16. Python中eval函数的作用
  17. 鼠友题库每日百题(六)
  18. 计算机专业方面主要有哪些证书
  19. 专家辩论区块链是否会取代现有支付系统
  20. 正则表达式--限制input输入0~1之间的小数,含0,1,最多两位小数

热门文章

  1. iphone4 base64 mp3 无法解析 html5,javascript - 如何使用HTML5在firefox上播放base64音频数据? - 堆栈内存溢出...
  2. csdn上修改字体的颜色
  3. 在线教育后端开发项目总结
  4. jsp中为什么在跳转500页面的时候 图片加载不出来
  5. Java访问控制修饰符
  6. Python 推导,内含,迭代器
  7. word List 10
  8. spring四种依赖注入方式
  9. LCA求解的四种模板
  10. hdu1686:KMP板子