标签:ch int ll 博弈论 玩家 Game ans Coin HDU3951
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;
}
标签:ch,int,ll,博弈论,玩家,Game,ans,Coin,HDU3951 来源: https://blog.51cto.com/u_15234622/2831607
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。