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. egret引擎中使用tiled运行在微信小游戏中

    egret的官方文档,对tiled的介绍不是很细致,很多东西都需要摸索.现在把踩的坑记录下来.作为一个备忘 引用tiledmap的库 在GitHub上下载egret的tiledmap支持库:https ...

  2. 【CV现状-3.3】特征提取与描述

    #磨染的初心--计算机视觉的现状 [这一系列文章是关于计算机视觉的反思,希望能引起一些人的共鸣.可以随意传播,随意喷.所涉及的内容过多,将按如下内容划分章节.已经完成的会逐渐加上链接.] 缘起 三维感 ...

  3. B站自动刷弹幕

    B站自动填弹幕(附带createEvent消息机制) 昨晚看的比赛真的要气死我.RNG 居然又输了... 为了LPL...我写了一个为LPL加油的脚本.希望大家能和我一起为LPL加油! 脚本代码如下: ...

  4. Linux C++轻量级开发指南

    作为一名产品开发,一套顺手的集成开发环境必不可少.大多数时候,开发经理将精力投入在产品需求分析上而忽视了研发质量甚至连基本的集成开发环境都没有统一.当然,如果你们的项目仅仅需要部署在单一的环境中或没有 ...

  5. Ubuntu 查看已安装软件

    apt list --installed dpkg -l

  6. 渗透测试-基于白名单执行payload--zipfldr.dll

    0x01 zipfldr.dll简介: zipfldr.dll自Windows xp开始自带的zip文件压缩/解压工具组件. 说明:zipfldr.dll所在路径已被系统添加PATH环境变量中,因此, ...

  7. 关于thinkphp框架中模型笔记

    模型这一块,感觉学习的不是很清楚,单独水一贴thinkphp中模型的学习笔记. 0x01 模型类简介 数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名, 把一张表对应为一个类,其中 ...

  8. msf各种弱口令爆破

    Msf: 写的很乱 记录下msf各个爆破弱口令的模块 run post/windows/gather/arp_scanner RHOSTS=10.10.10.0/24 使用arp_scanner模块 ...

  9. [USACO10NOV]购买饲料Buying Feed 单调队列优化DP

    题目描述 约翰开车来到镇上,他要带 KKK 吨饲料回家.运送饲料是需要花钱的,如果他的车上有 XXX 吨饲料,每公里就要花费 X2X^2X2 元,开车D公里就需要 D×X2D\times X^2D×X ...

  10. composer依赖管理与laravel框架安装

    步骤有点多,生怕哪一天忘记,记录下来会好点 laravel安装有两种途径:1.直接在一些国内第三方网站,如:https://www.golaravel.com/download/ 下载压缩包来解压即可 ...