2 条题解
-
2
题意
有个物品,每个物品有一个原价和一个会员价
我们可以使用次会员价
问当你有元钱的时候最多能买多少商品
做法
反悔贪心
我们每次选择原价最小或者使用完优惠券最小的商品
设用优惠券的钱为,原价为
若满足
(指最便宜的优惠价,指优惠最少的优惠券省下的钱,指最便宜的原价)
就将优惠券转移
否则就加最小的原价
code
#include <bits/stdc++.h> using namespace std; const long long N = 5e4 + 10; long long n, k, m, c[N], p[N]; void read(){ cin >> n >> k >> m; for(long long i = 1;i <= n; i++){ cin >> p[i] >> c[i]; } return ; } priority_queue<long long,vector<long long>,greater<long long> > d; struct node{ long long val, id; friend bool operator < (node a,node b){ return a.val > b.val; } }; priority_queue<node> P, C; bitset<N> vis; void compute(){ for(long long i = 1;i <= n; i++){ P.push({p[i],i}); C.push({c[i],i}); } for(long long i = 1;i <= k; i++){ d.push(0); } long long ans = 0, sum = 0; while(P.size()){ node a = P.top(); node b = C.top(); if(vis[a.id]) { P.pop(); continue; } if(vis[b.id]){ C.pop(); continue; } if(a.val < b.val + d.top()){ sum += a.val; if(sum > m) break; ans++; P.pop(); vis[a.id] = 1; } else{ sum += b.val + d.top(); if(sum > m) break; ans++; C.pop(); vis[b.id] = 1; d.pop(); d.push(p[b.id]-c[b.id]); } } cout << ans; return ; } int main(){ ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); read(); compute(); return 0; }
- 1
信息
- ID
- 73
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 61
- 已通过
- 12
- 上传者