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. js常用Matn函数的操练

    Math.PI console.log(Math.PI); 随机数以及向下取整 这是一个能实现从a-b之间随机打印一个整数 function rand_s(a, b) { var x = a + (b ...

  2. Zookeeper 学习笔记之 Leader Election

    ZooKeeper四种节点类型: Persist Persist_Sequential Ephemeral Ephemeral_Sequential 在节点上可注册的Watch,客户端先得到通知再得到 ...

  3. C#刷遍Leetcode面试题系列连载(2): No.38 - 报数

    目录 前言 题目描述 相关话题 相似题目 解题思路: 运行结果: 代码要点: 参考资料: 文末彩蛋 前言 前文传送门: C# 刷遍 Leetcode 面试题系列连载(1) - 入门与工具简介 上篇文章 ...

  4. CSS动画,2D和3D模块

    CSS3提供了丰富的动画类属性,使我们可以不通过flash甚至JavaScript,就能实现很多动态的效果.它们主要分为三大类:transform(变换),transition(过渡),animati ...

  5. springboot结合mybatis

    idea中新建springboot项目 pom.xml依赖部分如下 <dependencies> <dependency> <groupId>org.springf ...

  6. SpringBootSecurity学习(23)前后端分离版之OAuth2.0 其它模式

    密码模式 前面介绍了授权码模式和刷新令牌两种获取最新令牌的方法,下面来看一下其它模式.首先看密码模式,我们默认配置的三种模式中其实就包含密码模式的支持: 因此我们启动项目,直接使用密码模式即可,访问地 ...

  7. 自己写的Weblogic的poc

    """ 暂时只试用于Linux,先试试用一下反弹shell CVE-2017-10271的EXp """ import requests i ...

  8. netty源码解解析(4.0)-24 ByteBuf基于内存池的内存管理

    io.netty.buffer.PooledByteBuf<T>使用内存池中的一块内存作为自己的数据内存,这个块内存是PoolChunk<T>的一部分.PooledByteBu ...

  9. python编程基础之二十九

    栈和队列: 栈:先进后出,其他没多少特别之处了,一般可以用列表模拟栈,也可以用双端队列,封死一端. 队列:先进先出,也可以用列表模拟,但是一般用库函数,需要导collections 包:主要是为了解决 ...

  10. 深度长文回顾web基础组件

    什么是Serlvet ? 全称 server applet 运行在服务端的小程序: 首先来说,这个servlet是java语言编写的出来的应用程序,换句话说servlet拥有java语言全部的优点,比 ...