[Usaco 2012 Feb]Cow coupons牛券:反悔型贪心
Description
Farmer John needs new cows! There are N cows for sale (1 <= N <= 50,000), and FJ has to spend no more than his budget of M units of money (1 <= M <=$10^{14}$). Cow i costs $ P_i$ money (1 <=$ P_i$ <=$ 10^9$), but FJ has K coupons (1 <= K <= N), and when he uses a coupon on cow i, the cow costs $ C_i$ instead (1 <= C_i <=P_i). FJ can only use one coupon per cow, of course. What is the maximum number of cows FJ can afford? FJ准备买一些新奶牛,市场上有N头奶牛(1<=N<=50000),第i头奶牛价格为Pi(1<=$P_i$<=$10^9$).FJ有K张优惠券,使用优惠券购买第i头奶牛时价格会降为Ci(1<=$C_i$<=$P_i$),每头奶牛只能使用一次优惠券。FJ想知道花不超过M(1<=M<=$10^{14}$)的钱最多可以买多少奶牛$
很久很久很久以前的一道题,当时真的不会做。
我也不知道当时他们怎么A的。当时好像没学反悔型贪心啊。。。
最近被贪心虐的不轻,又除了一个变种:反悔型的。
需要稍微写一些了。啊啊啊教练我真的没有在水题啊我真不会
认真的讲,这题不错,很经典的反悔
反悔型贪心的特点就是当前获得的收益到时候可以再返还来得到更长远的收益,这就克服了贪心的目光短浅的弊端。
在这道题里,我们反悔的主要原因就是优惠券的应用。
最开始我们买下k头用了优惠券后最便宜的牛,这是初步贪心。
如果我们连这k头都买不起的话直接跳出就好了。
但是这样做的话我们用优惠券所省下的钱可能不是最多的
具体怎么反悔呢?其实我们的反悔就是要改变对优惠券的使用。
那么我们就花钱把优惠券买回来呗!
我们在买前k头牛的时候,把p-c加入一个小根堆,表示你要花多少钱才能再得到一张优惠券。
再开两个堆,把其它的牛存进去,分别存p和c。
然后不断采取最优决策:买回一张券再买一头折扣后的牛,或者不折扣地买一头牛。
不断取最便宜的。这样的话我们的贪心策略就正确了。
要注意为了防止牛买重了,所以c和p两个堆都要把牛的编号记下来,弹出时打上标记表示被买过。
这样就不会让一头牛被用券买了一次又没用券买了一次从而产生2的贡献。
要注意所有的牛都买完之后及时跳出。。。
细节还是挺多的。当时没A就对了。
好题。
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >cow,discounted_cow;
priority_queue<int,vector<int>,greater<int> >coupon;
int n,k,p[],c[];pair<int,int>r[];long long m;char al[];
int main(){
scanf("%d%d%lld",&n,&k,&m);
for(int i=;i<=n;++i)scanf("%d%d",&p[i],&c[i]),r[i]=make_pair(c[i],i);
sort(r+,r++n);
for(int i=;i<=k;++i){
if(m<r[i].first){printf("%d\n",i-);return ;}
m-=r[i].first;coupon.push(p[r[i].second]-r[i].first);al[r[i].second]=;
}
for(int i=;i<=n;++i)if(!al[i])
cow.push(make_pair(p[i],i)),discounted_cow.push(make_pair(c[i],i));
int ans=k;
while(ans<n){
if(coupon.top()+discounted_cow.top().first<cow.top().first){
if(coupon.top()+discounted_cow.top().first>m){printf("%d\n",ans);return ;}
m-=coupon.top()+discounted_cow.top().first;
int ord=discounted_cow.top().second;
al[ord]=;coupon.pop();coupon.push(p[ord]-c[ord]);
ans++;
}else{
if(cow.top().first>m){printf("%d\n",ans);return ;}
m-=cow.top().first;al[cow.top().second]=;ans++;
}
while(!discounted_cow.empty()&&al[discounted_cow.top().second])discounted_cow.pop();
while(!cow.empty()&&al[cow.top().second])cow.pop();
}printf("%d\n",n);
}
[Usaco 2012 Feb]Cow coupons牛券:反悔型贪心的更多相关文章
- USACO 2012 Feb Cow Coupons
2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MB Submit: 349 Solved: 181 [Su ...
- [Usaco2012 Feb] Cow Coupons
[Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...
- 2590: [Usaco2012 Feb]Cow Coupons
2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 306 Solved: 154[Su ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 215[S ...
- BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心
BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...
- 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大 ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
随机推荐
- 你真的懂Spring Java Config 吗?Full @Configuration vs lite @Bean mode
Full @Configuration和lite @Bean mode 是 Spring Java Config 中两个非常有意思的概念. 先来看一下官方文档关于这两者的相关内容: The @Bean ...
- python编程基础之五
转义字符:就是不方便从键盘之间输出,或者是原字符有特殊含义的一些字符, 下面列举几个常用的转义字符 \',\",\''',\""",\\,都是表示原字符的意思, ...
- e课表项目第二次冲刺周期第四天
昨天干了什么? 昨天,我在网上搜集了相关的资料,即连接安卓自带的数据库,查询了连接的方法,然后在电脑上,做了简单的练习,发现可以用,所以对我们的软件进行数据库的连接,设置了完成按钮的活动,即先保存到数 ...
- LeetCode_933-Number of Recent Calls
求最近3000毫秒内有多少次调用请求,每一次ping的时间一定比上一次的时间高:解法可以判断最后面一个数t1与最前一个数t2的差不大于3000毫秒,如果大于就直接舍弃,t1与t2之间的个数就是请求次数 ...
- PowerBI系列之什么是PowerBI
大家好,我是小黎子!一个专注于数据分析整体数据仓库解决方案的程序猿!今天小黎子就给大家介绍一个数据分析工具由Microsoft出品的全新数据可视化工具Power BI.微软Excel很早就支持了数据透 ...
- 基于Prometheus和Grafana的监控平台 - 环境搭建
相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics. Logging - 用于记录离散的事件.例如,应用程序的调试信息或错误信息.它是我们诊断问题的依据. ...
- [BZOJ4947] 字符串大师 - KMP
4974: [Lydsy1708月赛]字符串大师 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 739 Solved: 358[Submit][Sta ...
- Linux下yum与apt-get
linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包 ...
- Docker卷
要解决的问题:在移除了现有容器或者添加了新容器时,之前容器的数据无法访问. 为避免上述问题,Docker提供了以下策略来持久化数据 tmpfs挂载 绑定挂载 卷 1.tmpfs挂载 2.绑定挂载 将D ...
- VMware安装和linux(centos7)系统安装
下载centos系统ISO镜像 安装linux系统和winsdows安装系统一样,需要系统文件.浏览器访问centos官网进行下载,http://www.centos.org,因为是国外网站所有下载速 ...