2022杭电多校 Triangle Game(博弈论)

 输入:

 3
2 2 3
2 3 4
5 3 4

输出:

Win
Lose
Win

题目大意:给我们一个三角形的三条边x,y,z,每次操作可以把一个边变小,有2个人,每人每次进行一次操作,当通过该操作变小一条边之后,如果不能使得剩下的三条边构成一个三角形,那么这个人就输了,Kate先手,问最后Kate能不能赢。

解题思路:如果r=(x-1)^(y-1)^(z-1)!=0则先手必胜,如果等于0则先手必败。证明如下:

我们假设x,y,z,三条边分别为最短,次短和最长的三条边,因为可以构成三角形所以有x+y>z,进而有(x-1)+(y-1)>=z-1         

当r=0时:

·x=1,令y=z,此时x已经不能变小了,只能变y或z,但是一旦两者之中任何一个变小,就不能构成三角形了。

·x>1,假设我们变化x为x',那么x-1!=x'-1,所以(x'-1)^(y-1)^(z-1)!=0,这就转化到了r!=0的情况了。

当r!=0时:

下面三个不等式至少会有一个成立:(x-1)^r<x-1,(y-1)^r<y-1,(z-1)^r<z-1,为什么呢?r中每一位的1一定是由奇数次的1异或起来的,我们假设r中最高位的1是由y-1提供的,那么(y-1)^r最高位的1两两异或是0,一定比原来的y-1小,所以现在的r=r*r=0,又变回了r=0的状态。

综上所述,当r=0是,面临该局面的人 必败,r!=0时,面临该局面的人必胜,证明完毕。

上代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int x,y,z;
		cin>>x>>y>>z;
		if(((x-1)^(y-1)^(z-1))!=0)
		cout<<"Win"<<endl;
		else
		cout<<"Lose"<<endl;
	}
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值