问题概述
题目大意: 给定一堆石子,T 和 HL 轮流抽取一堆中的一颗,且不能抽上轮那堆石子,不能抽的一方败。
思路
先考虑一种简单的情况:假如
,
石子中的最大值比 还要大,那么先手只要一直从这一堆抽就行了。即先手必胜
假如石子分布得比较平均且s为偶数:所有的堆的石头个数都小于 。先手先拿一个石子后,假如出现了某一堆石子数目大于 ,(一定不是这一堆,不然先手就可以必胜了)后手就直接必胜。如果不存在,后手就直接拿走剩下堆中最大的或其它随便以颗,由于 等于,所以仍旧不存在上述情况,如此僵持,直到最后才会分出胜负,而最后由于s 是偶数,故后手拿完最后一颗,后手胜。
s为奇数:根据上面的推理类似
代码实现
代码如下:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include <numeric>
void solve() {
int n = 0;
cin >> n;
vector<int> piles(n, 0);
for (int i = 0; i < n; i++)
cin >> piles[i];
int maxnum = *max_element(piles.begin(), piles.end());
int sums = accumulate(piles.begin(), piles.end(), 0);
if (maxnum * 2 > sums || sums % 2 == 1) {
cout << "T" << endl;
}
else cout << "HL" << endl;
return;
}
int main() {
int N = 0;
cin >> N;
for (int i = 0; i < N; i++)
solve();
}