题解:CF2074B The Third Side

Problem

Statement

给了一个序列 \(a\),长度为 \(n\),每次选定 \(a_i,a_j\),将原序列中的这两个数替换成与之能构成三角形的 \(x\),即满足 \(a_i + x > a_j,a_j + x >a_i,a_i + a_j > x\),直到序列中只剩一个数,求序列中剩下的数的最大值。

Solution

要使剩下的那个数最大,\(x = a_i + a_j - 1\)

这样一来从大到小替换是最优的,我们用 multiset 模拟即可。

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
int Test, n, A[200010];

inline void Solve() {
	cin >> n;
	for (int i = 1; i <= n; i ++) cin >> A[i];
	multiset <int, greater<int>> S;
	for (int i = 1; i <= n; i ++) S.insert (A[i]);
	while (S.size() > 1) {
		int x = *S.begin(); S.erase (S.begin());
		int y = *S.begin(); S.erase (S.begin());
		S.insert (x + y - 1);
	}
	cout << *S.begin() << endl;
}

signed main() {
	cin >> Test;
	while (Test --) Solve();
	return 0;
}
posted @ 2025-03-12 10:28  xAlec  阅读(46)  评论(0)    收藏  举报