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\n", i, solve(n, K) ? "first" : "second");
	}
	return 0;
}
posted @ 2020-12-26 19:37  mrclr  阅读(49)  评论(0编辑  收藏  举报