[第1章 1.5t5] Cow Coupons G

218 字
1 分钟
[第1章 1.5t5] Cow Coupons G
//本题为反悔贪心,总结一下堆的知识,着重在于考察利用某些性质管理不同堆解决问题
//反悔贪心在于每次都比较一下是硬着头皮上还是选择反悔一次代价最小的
//如果是后者回报高,那就付出代价,把仅有的减免机会让给c组
//注意使用buy数组同步p和c组内已买过的物品,每一轮都要删掉已买的,保证一致性
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef struct{
ll pri,pre;
ll ord;
}pll;
struct cmp1{
bool operator()(const pll &a,const pll &b){
return a.pri>b.pri;
}
};
struct cmp2{
bool operator()(const pll &a,const pll &b){
return a.pre>b.pre;
}
};
int main(){
ll n,k,m;
cin>>n>>k>>m;
vector<bool> buy(n,false);
priority_queue<pll,deque<pll>,cmp1>p;
priority_queue<pll,deque<pll>,cmp2>c;
priority_queue<ll,deque<ll>,greater<>>delta;
for(ll i=0;i<k;i++)delta.push(0);
for(ll i=0;i<n;i++){
pll tmp;
cin>>tmp.pri>>tmp.pre;
tmp.ord=i;
p.push(tmp);
c.push(tmp);
}
ll ans=0;
while(!p.empty()){
while(!p.empty()&&buy[p.top().ord])p.pop();
while(!c.empty()&&buy[c.top().ord])c.pop();
if(p.empty())break;
if(p.top().pri<=c.top().pre+delta.top()){
m-=p.top().pri;
if(m<0)break;
buy[p.top().ord]=true;
ans++;
}else{
m-=delta.top()+c.top().pre;
if(m<0)break;
buy[c.top().ord]=true;
delta.pop();
delta.push(c.top().pri-c.top().pre);
ans++;
}
}
cout<<ans<<endl;
return 0;
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
[第1章 1.5t5] Cow Coupons G
https://hecloud.top/posts/15t5-cow-coupons-g/
作者
贺小云
发布于
2026-06-26
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
贺小云
一个热爱技术与折腾的博客,serverless起高楼,静态构建一键走,专注于CDN调优,2秒之内到德州。
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
碎碎念
站点统计
文章
46
分类
4
标签
0
总字数
23,903
运行时长
0
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0

当前页面没有目录