河北优化网站获客qq网站 内部搜索引擎
河北优化网站获客qq,网站 内部搜索引擎,直播网站怎么建设,WordPress stock记
今天闲来无事#xff0c;不想刷codeforces了#xff0c;到洛谷提高组训练营找几道水题刷着玩玩#xff08;虽然自己早已过了打OI的年纪#xff09;#xff5e;
简单博弈论专题
P1199 三国游戏
这么考虑#xff0c;由于电脑总是不能让我搭配出当前能搭配出的最大的…记
今天闲来无事不想刷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
假设其中ambmcmdmambmcmdma_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#x4E0E;b#x5F62;#x6210;#x7684;#x9ED8;#x5951;#x503C;tgt;amgt;dm" role="presentation" style="position: relative;">d与b形成的默契值tamdmd与b形成的默契值tamdmd与b形成的默契值t>a_m>d_m 而d与a形成的默契值为aMamdmd与a形成的默契值为aMamdmd与a形成的默契值为a_M>a_m>d_m 这样的话dmdmd_m不可能是ddd能匹配到的次大值,矛盾。
所以tlt;am" role="presentation" style="position: relative;">tamtamt 本次电脑不会选择到比amama_m更大的数。 随后我们只需要破坏掉电脑构造成最大的组合就可以了。
P1288 取数游戏II
如果出发点靠着0边那么只能往一个方向走并且走过的边的值一定要减到0不然对面会逆过来然后把边减到0这样我方就输了。
不靠0边的时候如果沿着某个方向走会赢那么就把沿路经过的边设置为0。 如果沿着那个方向走都不会赢你任取一个方向走的时候不把边设置为0对方在下一次走的时候也会继续沿着这个方向并把下一条边设置成0你还是要一直沿着这个方向走。
所以不管怎么样经过的边都会变成0也就是说一旦选定方向了就只能一直走。 所以结果很固定你只要把2个方向都老老实实沿着走下去有一种情况能赢就能赢否则就不能赢。
P1290 欧几里德的游戏
典型的辗转相除法。
假设这时候状态是(a,b)满足ab(a,b)满足ab(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]k1[a/b]k1[a/b] = k > 1那么就是必胜的,因为如果(b,a%b)(b,a%b)(b,a\%b)是必败态那么a直接剪去k个b否则的话a剪去k-1个b。很简单是不是。
P2148 [SDOI2009]ED
山东的省选题中规中矩。 由于多个组是独立游戏所以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,y1);}
}
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函数的方法就不说了注意的点
这题要用到位运算压缩状态不然时间、空间可能不够。开O2
代码
#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_mapint,int mp;for(int i 19;i 0;--i){if(!(status(1i))) continue;int j i-1;for(;j 0;--j)if(!(status(1j)))break;if(j -1) continue;mp[grundy(status ^ ((1i) (1j)))] 1;;}for(int i 0;;i){if(!mp[i])return sg[status] i;}
}
int main(){cinT;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;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88858.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!