A115472.阈值远征题解
2026-04-29 21:27:58
发布于:北京
11阅读
0回复
0点赞
本人的第一篇题解,内容全在注释上
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
//坚决不用万能头
using namespace std;
void solve() {
int n;
if (!(cin >> n)) return;
vector<long long> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<long long> b(n);
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
// 对武器威力进行升序排序
sort(a.begin(), a.end());
// 计算前缀和,并通过枚举通过的关卡数 k 来求解
long long max_score = 0;
long long current_sum_b = 0;
for (int k = 1; k <= n; ++k) {
current_sum_b += b[k-1];
// 如果需要的武器数量超过了总武器数,无法通过更多关卡
if (current_sum_b > n) {
break;
}
// 我们需要 current_sum_b 把武器。
// 为了最大化难度 x,我们选取威力最大的 current_sum_b 把武器。
// 这 current_sum_b 把武器中,威力最小的是 a[n - current_sum_b]。
// 设定难度 x = a[n - current_sum_b],则所有 >= x 的武器有效。
// 有效武器数量至少为 current_sum_b,足以通过前 k 关。
long long x = a[n - current_sum_b];
long long score = x * k;
if (score > max_score) {
max_score = score;
}
}
cout << max_score << endl;
}
int main() {
// 优化IO操作
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
if (cin >> t) {
while (t--) {
solve();
}
}
return 0;//撒花!!!
}
最后,望大佬们点一个免费的赞,谢谢
有问题打在评论区
这里空空如也






有帮助,赞一个