100
#LS1197. 【普及】后悔贪心【普及】后悔贪心
【普及】后悔贪心
给你 个长度为 的数组 和 ,你需要从这个 个数中选出 个数,并满足如下 个条件:
- 从数组 中选 个数,从数组 中选 个数
- 对于 ,满足 和 这两个数中有且仅有 个被选中 你现在希望选出的 个数和最大,输出这个最大的和
输入格式
第一行包含
接下来 行,每行包含 个整数 和
输出格式
输出选中的 个数的最大和
4 2
1 2
3 5
6 9
10 14
27
提示
【样例 2 解释】
-
可以选中数组 中的 ,数组 中的
-
这样和为
-
这是一个经典问题,我们可以先不管数量限制,直接选 和 中较大的那个
-
然后再根据数量限制调整
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n, m, x, y, ans = 0;
cin >> n >> m;
vector<priority_queue<int>> q(2);
for (int i = 0; i < n; i++) {
cin >> x >> y;
// 先直接选大的, 把交换的差值放入 priority_queue
if (x >= y) q[0].push(y - x), ans += x;
else q[1].push(x - y), ans += y;
}
// 然后根据数量限制调整, 调整的时候贪心地选差值最小的即可
while (q[0].size() > m) ans += q[0].top(), q[0].pop();
while (q[1].size() > n - m) ans += q[1].top(), q[1].pop();
cout << ans << '\n';
return 0;
}
【数据范围】
请思考后再点击查看提示
来源
相关
在以下作业中: