https://ac.nowcoder.com/acm/problem/26221
排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> PII; // <酸度, 甜度>
int main() {
int n, k;
cin >> n >> k;
vector<PII> vp(n);
for (int i = 0; i < n; ++i) cin >> vp[i].first;
for (int i = 0; i < n; ++i) cin >> vp[i].second;
sort(vp.begin(), vp.end(), [&](const PII a, const PII b) {
if(a.second != b.second) return a.second > b.second;
else return a.first < b.first;
});
long long s = 0, t = 0;
for (int i = 0; i < k; ++i) {
s += vp[i].first;
t += vp[i].second;
}
cout << s << ' ' << t << endl;
return 0;
}
优先队列
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct Orange {
int acidity;
int sweetness;
Orange(int a, int s) : acidity(a), sweetness(s) {}
bool operator<(const Orange& o) const {
if (sweetness == o.sweetness) {
return acidity < o.acidity; // 甜度相同,酸度小的优先
}
return sweetness > o.sweetness; // 甜度大的优先
}
};
int main() {
int n, k;
cin >> n >> k;
vector<int> acidity(n), sweetness(n);
for (int i = 0; i < n; ++i) {
cin >> acidity[i];
}
for (int i = 0; i < n; ++i) {
cin >> sweetness[i];
}
// 使用小根堆存储橘子,限制堆的大小为前k个
priority_queue<Orange> pq;
for (int i = 0; i < n; ++i) {
pq.push(Orange(acidity[i], sweetness[i]));
if (pq.size() > k) {
pq.pop(); // 弹出堆顶元素,保持堆的大小为k
}
}
long long totalAcidity = 0, totalSweetness = 0;
// 计算总酸度和总甜度
while (!pq.empty()) {
totalAcidity += pq.top().acidity;
totalSweetness += pq.top().sweetness;
pq.pop();
}
cout << totalAcidity << " " << totalSweetness << endl;
return 0;
}