P2707
题解思路:
因为当钱数是
因为这个
当第
把第
发现把第
那么就贪心的选多的最多的,即
扩展完之后再把扩展完的下一个增加的收益放到堆里即可。
CODE:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k;
int a[100010], b[100010], cnt[100010];
priority_queue<pair<ll, int>> q;
ll ans;//开long long!
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) scanf("%d%d", &a[i], &b[i]);
for (int i = 1; i <= n; ++i) {
q.push({a[i] - 2 * b[i] - b[i]});//初始值
}
for (int i = 1; q.size() && i <= k; ++i) {
auto t = q.front();
q.pop();
if (t.first < 0) break;
ans += t.first;//加上这段增加的值
cnt[t.second]++;//增加了一个
q.push({a[i] - 2 * (cnt[t.second] + 1) * b[i] - b[i], t.second});//增加完之后放上
}
printf("%lld\n", ans);
return 0; ctj
}