
博弈论
穷源溯流
路很长,尽管走便是。
-
原创 洛谷 P1247 取火柴游戏(nim 游戏)
简单说一下 nim游戏 的博弈原理,先将 a[i] 转化成二进制数,那么题目变成了每一次可以取走任意 a[i] 的 任意个 1sum 是所有 a[i] 的异或值如果 sum=0,说明有偶数个 1,先手拿 x,后手也拿 x,先手必败如果 sum!=0,我们考虑去掉一堆,这 n-1 堆相互异或得到的结果 res,剩下的那一堆为 x,如果 x>res,那么我们考虑将拿掉 x-res,那么剩下的那一堆与其余的 n-1 堆形成异或为 0 的必败局面,可以证明一定存在 x 使得 sum!...2021-02-26 22:21:0114
0
-
原创 Educational Codeforces Round 99 (Rated for Div. 2) C. Ping-pong(博弈论)
有两个人打乒乓球,都想要赢的次数尽量多,每个人有 n ,m 点体力,每击打一次球都要消耗一点体力值,A 先发球,每个人可以接球或不接球,没有回球的人输掉这场比赛,胜者如果还有体力的话再次发球,问最后各自胜利的次数是多少A,B 两人打球,如果都想要分数最大化的话,B 不会去接球,一直让 A 打这题是来搞心态的吧 int i,j,k; int n,m; int a[N]; int main(){ //IOS; rush(){...2020-12-23 19:50:1922
0
-
原创 POJ 1704 Georgia and Bob(Nim 博弈)
有 n 颗棋子,给出 n 颗棋子位于数轴上的坐标,G 先走,判断谁赢Nim 博弈的变形,如果 n 为偶数,那么每两个棋子之间网格可以看作一堆硬币,如果 n 为奇数,则将第一个棋子与之前的网格看作第一堆硬币const int N=1e4+5; int i,j,k; int n,m,t; int a[N]; int p[N];int main(){ //IOS; rush(){ sd(n); for...2020-11-04 23:35:4023
0
-
原创 POJ 2348 Euclid‘s Game(博弈论)
给出两个整数 a,b,每次用较小的数去减较大的数,例如 ,当 a>b 时,a=a-k*b完成运算之后 a保持大于等于 0,问当某一数字变为 0 时,另一方输默认a>b ,a=a-k*b有余数 res=a-k*b,因为在其中的状态实在是太多了,特殊考虑当 a-b<b时,这一步没有任何余地,也就是 k 只能取 1,那么我们只能通过递减的方法判断谁赢但是当 k>1 时,此时 a 可以减去多个 b,此时一定可以赢,因为当减去 k*b 会输的时候,这样只需要减...2020-11-04 13:00:4851
0
-
原创 POJ 2484 A Funny Game(博弈论)
有 n 个硬币,每次可以将 1 枚硬币翻面,或者将相邻的两个翻面,问最后谁无法翻面谁输?只要存在 2个以上的硬币 后手赢,因为后手可以将环分成两个相等的段,然后重复先手的动作,使两边的段一直保持相等的状态,所以后手会拿到最后的硬币 int i,j,k; int n,m,t; int main(){ //IOS; while(~sd(n),n){ if(n<=2) puts("Alice"); else pu...2020-11-02 20:53:4421
0
-
原创 C. Number Game(博弈)
A 和 F 比赛,有一个数 n ,有以下操作1.减一2.除以一个大于 1 并且必须是奇数的因数,可以除以自己,如果自己是奇数的话规定 A 先操作,若 n 是奇数,n 除以它本身 ,A 赢若为偶数,只要有一个因数是奇数,那么一定存在最大的奇因数,除以这个最大的,一定变为偶数,若不为 2 ,对手减一后 ,A 一定赢//#pragma GCC optimize(2)//#include <bits/stdc++.h>#include <iostream>#...2020-06-21 09:57:18278
0