Thinking Process
因為不能夠馬上選擇同一個 pile,所以相當於當有一堆石頭數量超過總數的一半時(maxPile * 2 > numStones
),第一個玩家就可以一直選擇這一堆石頭,迫使第二個玩家一直選擇其他堆石頭,因為其他堆石頭數量總和少於這一堆,所以第一個玩家一定會贏。
例子:[1, 2, 5]
,玩家 A 可以一直選第三堆,當 1, 2
都被玩家 B 拿完之後,因為 B 不能選擇 A 剛剛拿的那堆,所以 B 無法選擇,輸了遊戲。
若每堆石頭個數都不超過全部的一半,則分成兩種 case,第一種是全部的總數是偶數,這樣的話,第二個玩家總是可以贏得遊戲。若將每顆石頭都編號,假設玩家 A 選擇的石頭的編號是 i ,全部有 S 顆石頭,則玩家 B 的策略就是選擇 i + S / 2
,就可以贏得遊戲。例如:[1, 2, 3]
,編號會是 [[0], [1, 2], [3, 4, 5]]
,則玩家 A & B 選擇的 pair 可能會是 (0, 3), (1, 4), (2, 5)
,因為每堆都不超過 S / 2
,所以玩家 B 永遠不會選到和 A 同一堆的石頭。
若石頭總數是奇數,則玩家 A 任意選了一顆石頭後,總數就變成偶數,根據剛剛的討論,這時候玩家 B 就一定會輸。
Code
Time Complexity: , Space Complexity:
#include<bits/stdc++.h>
using ll = long long;
using ld = long double;
using namespace std;
void run_case(){
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n);
for (int &x : a) cin >> x;
int maxPile = *max_element(a.begin(), a.end());
int numStones = accumulate(a.begin(), a.end(), 0);
if (maxPile * 2 > numStones || (numStones & 1)) cout << "T" << endl;
else cout << "HL" << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(NULL);
int tests = 1;
// cin >> tests;
while(tests--){
run_case();
}
return 0;
}