HDU3951 Coin Game

hdu传送门
vjudge传送门


好久没有做博弈论的题了,所以比赛的时候遇到这题基本上就是没思路。


这题跟nim游戏以及sg函数等博弈论知识没什么关系,但是用到了博弈论的一个经典思路:镜像操作。
当玩家一拿完后,必然断环成链,而如果玩家二再把这条链分成完全相同的两部分,那么只要完全仿照玩家一的做法,玩家二必然能赢。
所以只要判断能否分成相等两部分即可:
1.如果(n leqslant k),那么玩家一赢。
2.否则当(k > 1)的时候,必然能分成相等的两部分,即玩家二赢。
3.当(k=1)(n-1)为奇数时,玩家二赢。

#include<cstdio>
#include<cctype>
using namespace std;
#define In inline
typedef long long ll;
In ll read()
{
	ll ans = 0;
	char ch = getchar(), las = ' ';
	while(!isdigit(ch)) las = ch, ch = getchar();
	while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
	if(las == '-') ans = -ans;
	return ans;
}

In bool solve(int n, int K)
{
	if(n <= K) return 1;
	if(K > 1) return 0;
	return n & 1;
}

int main()
{
//	MYFILE();
	int T = read();
	for(int i = 1; i <= T; ++i)
	{
		int n = read(), K = read();
		printf("Case %d: %s
", i, solve(n, K) ? "first" : "second");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/mrclr/p/14193953.html