题目链接在这里:​​Problem - H - Codeforces​

这个题因为数据不大,可以用贪心去模拟做。就是每一个人都不让对方在剩余的大堆里拿石子,所以每一个人都在自己所能拿到的最大堆里拿(类似于保护这个堆不让别人拿)

正解的博弈论我们先讨论特殊情况,就是有一堆比剩下所有的都大,那只要有一个人一直拿这个堆的石子就能赢。

一般情况下,为了避免这种情况的发生,一定会让每个堆同时的减下去,也就是说,到最后每个堆的石子数是相等的,不用考虑是否是一个堆的情况,只用考虑整个总数的奇偶就行了。

 

1 #include "bits/stdc++.h"
2 using namespace std;
3 const int MAX=105;
4 int t,n,a[MAX],an;
5 priority_queue <int> q;
6 int main(){
7 freopen ("h.in","r",stdin);
8 freopen ("h.out","w",stdout);
9 int i,j,la,zt;
10 scanf("%d",&t);
11 while (t--){
12 scanf("%d",&n);
13 for (i=1;i<=n;i++) scanf("%d",&a[i]);
14 while (!q.empty()) q.pop();
15 for (i=1;i<=n;i++) q.push(a[i]);
16 an=la=0;
17 while (!q.empty()){
18 zt=q.top();q.pop();
19 zt--;
20 if (la!=0) q.push(la);
21 la=zt;
22 an++;
23 }
24 if (an%2==1) printf("T\n");
25 else printf("HL\n");
26 }
27 return 0;
28