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牛券:反悔型贪心的更多相关文章

  1. USACO 2012 Feb Cow Coupons

    2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MB Submit: 349 Solved: 181 [Su ...

  2. [Usaco2012 Feb] Cow Coupons

    [Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...

  3. 2590: [Usaco2012 Feb]Cow Coupons

    2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 306  Solved: 154[Su ...

  4. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  5. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

  6. BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心

    BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...

  7. 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大 ...

  8. [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...

  9. BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序

    Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...

随机推荐

  1. Nepxion Discovery【探索】微服务企业级解决方案

    Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...

  2. android 6.0导航栏 NavigationBar影响视图解决办法

    在开发app的时候会遇到有些测试手机没有物理按钮,比如最近在做的一个app在小米手机上运行显示效果很好,但是在华为P7手机上显示就乱了,底部的NavigationBar直接覆盖在主视图上,导致按钮无法 ...

  3. 六、springboot 简单优雅是实现短信服务

    前言 上一篇讲了 springboot 集成邮件服务,接下来让我们一起学习下springboot项目中怎么使用短信服务吧. 项目中的短信服务基本上上都会用到,简单的注册验证码,消息通知等等都会用到.所 ...

  4. ui自动化测试

    一.梳理 1.根据要求需要自动添加很多条数据 2.这就涉及到ui方面的知识.元素定位的方法(这个就能遇到很多坑,要完全掌握元素定位才能避免进坑).循环等(代码基础要掌握好) 二.操作 选择进行自动化操 ...

  5. python编程基础之三十三

    构造方法: 目的:构造方法用于初始化对象,可以在构造方法中添加成员属性 触发时机:实例化对象的时候自动调用 参数:第一个参数必须是self,其它参数根据需要自己定义 返回值:不返回值,或者说返回Non ...

  6. Save your cats Aizu - 2224

    Nicholas Y. Alford was a cat lover. He had a garden in a village and kept many cats in his garden. T ...

  7. 如何使用Externalizable接口自定义Java中的序列化

    Java序列化过程的缺点 我们都知道如何使用Serializable接口序列化/反序列化一个对象,并且如何使用writeObject 和readObject方法自定义序列化过程. 但是这些自定义还不够 ...

  8. django html母版

    08.12自我总结 django母版 一.母版写的格式 在需要导入的地方写 {% block 名字定义 %} {% endblock %} 二.导入模板 {% extends 'FUCK.html' ...

  9. 小白学 Python(6):基础运算符(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  10. 微信小程序实现九宫格切图,保存功能!

    效果如下图: 代码如下: <view class='sudoku'> <scroll-view scroll-x scroll-y class='canvas-box'> &l ...