题解:CF2074B The Third Side
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;
}

浙公网安备 33010602011771号