F题:Vouchers
标签:贪心、堆优化
题意:给定
n
n
n个商品,每个商品价格为
p
i
p_i
pi元,有
m
m
m张优惠券,第
i
i
i优惠券至少要购买价格为
L
i
L_i
Li元的商品才能折扣
D
i
D_i
Di元,每张优惠券只能用一次,同一物品不能使用多张优惠券。求购买所有商品的最少总金额为多少。
题解:按照出售价格从小往大,因为有一个条件
L
>
D
L>D
L>D,所以不可能出现折扣大于商品的情况,用一个堆保存小于该商品售价所有
L
L
L对应的折扣
D
D
D,每次贪心取折扣最大的,取完就弹出堆,保证只取一次。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, p[200005], ans;
priority_queue<int> q;
pair<int, int> c[200005];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> p[i];
ans += p[i];
}
for (int i = 1; i <= m; i++) cin >> c[i].first;
for (int i = 1; i <= m; i++) cin >> c[i].second;
sort(p + 1, p + 1 + n);
sort(c + 1, c + 1 + m);
for (int i = 1, pos = 1; i <= n; i++) {
while (pos <= m && c[pos].first <= p[i]) {
q.push(c[pos].second);
pos++;
}
if (!q.empty()) {
ans -= q.top(); q.pop();
}
}
cout << ans << endl;
return 0;
}