博弈论手记

博弈论基础练习

1.P4101 [HEOI2014]人人尽说江南好

题目描述:

题目分析:

由题意可知 N N N为初始小石子堆数,且每堆数量为 1 1 1
在合并时,合并后每堆数量不可超过 M M M。获胜的标志当前所有的堆对方无法继续操作。
于是可以知道,当可操作堆数为奇数时,我方获胜,否则对方获胜。所以若使后继结果对己方为最优,则选择每次移动数量最少的堆。
可得 A N S = ( N M o d M ) ∗ ( M − 1 ) ANS=(N Mod M)*(M-1) ANS=(NModM)(M1) A N S + = ( ( N M o d M ) − 1 ) ∣ 0 ANS+=((N Mod M )-1)|0 ANS+=((NModM)1)0

CODE:

#include
#include
#include
using namespace std;
int ans[10010];
int QRead(){
     
	int x=0,f=1;char c=getchar();
	while(c>'9'||c<'0'){
     if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){
     x=x*10+c-'0';c=getchar();}
	return x*f;
} 
int main(){
     
	int T=QRead(),a,b;
	for(int i=1;i<=T;++i){
      
		a=QRead(),b=QRead();
		ans[i]=(b-1)*(a/b);
		if(a%b) ans[i]+=a%b-1;
		ans[i]%=2; 
	}
	for(int i=1;i<=T;++i){
     
		if(ans[i])printf("0\n");
		else	printf("1\n");
	}
	return 0;
}

反思与总结:

  1. 博弈论题目首先需要判断必胜(或必败)的条件

2.P5675 [GZOI2017]取石子游戏

题目描述:

题目分析:

你可能感兴趣的:(博弈论)