CF1396B Stoned Game
算法一:用 set 模拟游戏过程
不难发现,石头越多的堆越有用。所以有一个显然的贪心策略是每次选择对手上一次未选、且数目最多的石头堆。用 set 维护即可。
记 \(S = \sum{a_i}\),时间复杂度为 \(O(S \log S)\)。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
#define pii pair<int, int>
#define mp make_pair
#define fi first
#define se second
using namespace std;
using ll = long long;
const int N = 1e4;
int a[N], n, T;
set<pii> s;
string winner[5] = {"T", "HL"};
namespace task{
void Main(){
cin >> n;
F(i, 1, n){
cin >> a[i];
s.insert(mp(a[i], i));
}
int flag = 0, nw = 0;
while(1){
auto it = s.end();
-- it;
if(it->second == flag){
if(s.size() == 1){
cout << winner[1 - nw] << '\n';
break;
}
-- it;
}
pii tmp = *it;
s.erase(it);
if(tmp.fi > 1){
s.insert(mp(tmp.fi - 1, tmp.se));
flag = tmp.se;
}
else flag = 0;
if(s.size() == 0){
cout << winner[nw] << '\n';
break;
}
nw = 1 - nw;
}
s.clear();
return ;
}
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T --) task::Main();
return fflush(0), 0;
}
算法二
记 \(mx = \max_{i = 1}^{n}a_i, \ sum = \sum_{i = 1}^{n}a_i\),容易发现当 \(mx \gt sum - mx\) 时,先手必胜。
而当 \(mx \le sum - mx\) 时,又会有 \(mx \le \frac{sum}{2}\),因此容易发现,如果按算法一中的贪心策略来玩游戏,整个过程都不会出现某一组的数目大于除它之外的总和。也就是说,石子被全部取完,游戏才会结束。此时胜负显然取决于 \(sum\) 的奇偶性。
时间复杂度 \(O(n)\)。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
using namespace std;
using ll = long long;
const int N = 1e4;
int a[N], n, T;
namespace task{
void Main(){
int sum = 0, mx = 0;
cin >> n;
F(i, 1, n){
cin >> a[i];
sum += a[i];
mx = max(mx, a[i]);
}
if(mx > sum - mx || (sum % 2 == 1)) cout << "T\n";
else cout << "HL\n";
}
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T --) task::Main();
return fflush(0), 0;
}

浙公网安备 33010602011771号