题意:
有n堆石子,每堆分别有ai个石子。
两者轮流取其中一个石子。但不能取上次对手取过的那一堆。特殊的,第一次取可以取任何一堆的石子。
当前先手取完要取的石子之后使对手无路可走时,先手获胜。
t组数据,每组数据给出n和a,输出谁必会胜利。若先手胜利输出“T”,若后者胜利输出“HL”。无引号。
思路:
思考一下必胜状态或者必败状态。发现必胜状态可以分成两种:
1:当 ai>sum-ai 时,先手只需要占住第 ai 堆必胜
2:否则,考虑最终状态必定只有一堆石子,现证明双方都可以通过设定操作策略为取走目前可取的石子最多的那堆做到最后一堆石子被拿干净:
假设不被拿干净,必定是出现了最多石子的那堆石子数目大于其他之和的状态(例如最终状态),逆推回去可以发现每两次取石子就有一个人取了这堆,逆推至初始状态与“否则”矛盾,不成立
故 ai≤sum 时最终状态必定是全部石子被取完,只需判断总石子数奇偶即可。
#include<bits/stdc++.h>
using namespace std;
using i64=long long;
const int N=1e6+10;
i64 a[N];
const i64 mod=1e9+7;
void solve(){
int n;
cin>>n;
i64 sum=0;
i64 maxl=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
maxl=max(maxl,a[i]);
}
if(maxl>sum-maxl||((maxl^(sum-maxl))&1)){
cout<<"T\n";
}
else cout<<"HL\n";
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
}