CF1396B Stoned Game

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;
}
posted @ 2025-08-05 17:01  superl61  阅读(7)  评论(0)    收藏  举报