[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想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
随机推荐
- 滴滴热力图-php版(后面有js版本)
) * ) ) * ) {) * *pi() / ) * ]) % ) {//在多边形外return false;} else { //在多边形内return true;} }
- Nebula 架构剖析系列(零)图数据库的整体架构设计
Nebula Graph 是一个高性能的分布式开源图数据库,本文为大家介绍 Nebula Graph 的整体架构. 一个完整的 Nebula 部署集群包含三个服务,即 Query Service,S ...
- Executor线程池原理详解
线程池 线程池的目的就是减少多线程创建的开销,减少资源的消耗,让系统更加的稳定.在web开发中,服务器会为了一个请求分配一个线程来处理,如果每次请求都创建一个线程,请求结束就销毁这个线程.那么在高并发 ...
- nginx的负载均衡实战
前言 nginx是一个高性能的HTTP和反向代理的服务器.它有三个最基本的功能,一是当做web服务器.二是作为反向代理服务器.三是提供负载均衡(在反向代理基础上),由于它占有内存小,并发能力强,所以在 ...
- JZOJ 3875 星球联盟
[问题描述] 在遥远的 S 星系中一共有 N 个星球,编号为 1…N.其中的一些星球决定组成联盟, 以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这 N 个星球间有 M 条太空 ...
- 单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)
网上看过一句话,单元测试就像早睡早起,每个人都说好,但是很少有人做到.从这么多年的项目经历亲身证明,是真的. 这次借着项目内实施单元测试的机会,记录实施的过程和一些总结经验. 项目情况 首先是背景,项 ...
- Python学习笔记五(读取提取写入文件)
#Python打开读取一个文件内容,然后写入一个新的文件中,并对某些字段进行提取,写入新的字段的脚本,与大家共同学习. import os import re def get_filelist(dir ...
- Android 列表(ListView、RecyclerView)不断刷新最佳实践
本文微信公众号「AndroidTraveler」首发. 背景 在 Android 列表开发过程中,有时候我们的 Item 会有一些组件,比如倒计时.这类组件要求不断刷新,这个时候由于列表复用的机制,因 ...
- oracle弱口令攻击
oracle弱口令攻击 0x00 oracle数据库简介 oracle数据库是现在很流行的数据库系统,很多大型网站都采用Oracle,它之所以倍受用户喜爱是因为它有以下突出的特点: 一.支持大数据 ...
- [JoyOI1519] 博彩游戏
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 Bob最近迷上了一个博彩游戏…… 题目描述 这个游戏的规则是这样的:每花一块钱可以 ...