人人尽说江南好 题解 [博弈论]

人人尽说江南好

传送门:[HEOI2014]人人尽说江南好
先放词:

菩萨蛮 韦庄
人人尽说江南好,游子只合江南老,青水碧于天,画船听雨眠。
垆边人似月,皓腕凝霜雪,未老莫还乡,还乡须断肠。

题目分析:
第一眼看上去,貌似很难

但是如果再仔细看一下,就会发现…
还是很难

不过只要你认真思考这个题,你就会发现…
已经过去半个小时了,还是一点头绪都没有


首先我们要知道一个道理:

如果再一局中操作偶数次后无法操作,则先手获胜。反之,后手获胜。

在无法操作时,场上的局面一定是 m , m , m ⋅ ⋅ ⋅ m , ( n % m ) m,m,m···m,(n\%m) m,m,mm,(n%m)

n ÷ m n÷m n÷m 堆 “ m m m

n % m = 0 n\%m=0 n%m=0 时,共有 n ÷ m n÷m n÷m 堆,操作了 n − n ÷ m n-n÷m nn÷m

n % m ≠ 0 n\%m≠0 n%m=0 时,共有 n ÷ m + 1 n÷m+1 n÷m+1 堆,操作了 n − ( n ÷ m + 1 ) n-(n÷m+1) n(n÷m+1)

判断次数奇偶即可

特殊情况: m = = 1 m==1 m==1 时,后手获胜

Code:

#include<bits/stdc++.h>
using namespace std;
inline int Read(){
	int dx=0,fh=1;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-')	fh=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		dx=dx*10+c-'0';
		c=getchar();
	}
	return dx*fh;
}
int m,n,T;
int main(){
	T=Read();
	while(--T>=0){
		n=Read(),m=Read();
		if(m==1)	printf("1\n");
		else	if(n%m)	printf("%d\n",((n-n/m)%2));
		else	printf("%d\n",((n-n/m-1)%2));
	}
	return 0;
}

反思与总结:

  • 要分析题中的特殊情况
  • 通过分析最初的局面与最后的局面来分析步数
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值