1397D. Stoned Game(博弈)

哎,这题死活想不出来…

只能加几分了,哎

Ⅰ . 考 虑 极 端 情 况 \color{Red}Ⅰ.考虑极端情况 .

考 虑 特 殊 情 况 , 当 某 一 堆 石 子 x 超 级 多 的 时 候 考虑特殊情况,当某一堆石子x超级多的时候 ,x

先 手 肯 定 一 直 拿 这 堆 石 子 , 那 后 手 只 能 拿 其 他 石 子 先手肯定一直拿这堆石子,那后手只能拿其他石子 ,

如 果 x 大 于 其 他 石 子 和 , 那 么 后 手 没 石 子 拿 了 , 先 手 仍 然 拿 这 堆 , 先 手 赢 如果x大于其他石子和,那么后手没石子拿了,先手仍然拿这堆,先手赢 x,,,

那一般情况怎么办呢?

假 设 石 子 总 数 是 s u m n 个 假设石子总数是sumn个 sumn

可 以 想 到 , 最 后 分 出 胜 负 是 因 为 只 剩 最 后 一 堆 石 子 , 设 剩 下 x 个 可以想到,最后分出胜负是因为只剩最后一堆石子,设剩下x个 ,,x

谁 先 拿 x 这 堆 谁 就 赢 了 谁先拿x这堆谁就赢了 x

问 题 在 于 x 是 多 少 , 如 果 知 道 x 就 知 道 ( s u m n − x ) 的 奇 偶 性 问题在于x是多少,如果知道x就知道(sumn-x)的奇偶性 x,x(sumnx)

这 样 就 能 知 道 谁 最 后 拿 了 x 这样就能知道谁最后拿了x x

假 设 x = 5 , 那 么 总 石 子 数 被 取 到 9 的 时 候 假设x=5,那么总石子数被取到9的时候 x=5,9

接 下 来 拿 的 人 可 以 一 直 拿 x 这 堆 , 就 赢 了 , 原 因 同 Ⅰ 接下来拿的人可以一直拿x这堆,就赢了,原因同\color{Red}{Ⅰ} x,,

所 以 另 一 个 人 一 定 不 会 让 这 种 事 发 生 , 在 之 前 的 决 策 就 会 不 让 这 堆 石 子 那 么 突 出 所以另一个人一定不会让这种事发生,在之前的决策就会不让这堆石子那么突出 ,

假 设 x = 4 , 那 么 总 石 子 数 被 取 到 7 的 时 候 , 接 下 来 取 得 人 就 必 胜 了 假设x=4,那么总石子数被取到7的时候,接下来取得人就必胜了 x=4,7,

所 以 另 一 个 人 在 之 前 的 决 策 就 不 会 让 这 堆 石 子 这 么 突 出 所以另一个人在之前的决策就不会让这堆石子这么突出

同 理 x 只 能 等 于 1 同理x只能等于1 x1

也 就 是 最 后 一 定 会 拿 得 只 剩 下 1 颗 石 子 啊 ! ! \color{Red}也就是最后一定会拿得只剩下1颗石子啊!! 1!!

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+10;
int t,n,a[maxn],b[maxn];
signed main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n;
		int maxx=0,sumn=0;
		for(int i=1;i<=n;i++)
		{
			cin >> a[i];
			sumn+=a[i];
			maxx=max(maxx,a[i]);
		}
		if( maxx>(sumn-maxx) )	cout << "T\n";
		else
		{
			if( sumn%2==1 )	cout << "T\n";
			else	cout << "HL\n";
		}
	}
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值