2590: [Usaco2012 Feb]Cow Coupons

Time Limit: 10 Sec Memory Limit: 128 MB

Submit: 349 Solved: 181

[Submit][Status][Discuss]

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? PROBLEM NAME: coupons

FJ准备买一些新奶牛,市场上有N头奶牛(1<=N<=50000),第i头奶牛价格为Pi(1<=Pi<=109)。FJ有K张优惠券,使用优惠券购买第i头奶牛时价格会降为Ci(1<=Ci<=Pi),每头奶牛只能使用一次优惠券。FJ想知道花不超过M(1<=M<=1014)的钱最多可以买多少奶牛?

Input

  • Line 1: Three space-separated integers: N, K, and M.
  • Lines 2..N+1: Line i+1 contains two integers: \(P_i\) and \(C_i\).

Output

  • Line 1: A single integer, the maximum number of cows FJ can afford.

Sample Input

4 1 7

3 2

2 2

8 1

4 3

Sample Output

3

OUTPUT DETAILS: FJ uses the coupon on cow 3 and buys cows 1, 2, and 3, for a total cost of 3 + 2 + 1 = 6.

HINT

Source

Gold

Solution Notes (Nathan Pinsker):

There are several different ways to approach this problem.

One of them stems from the initial idea of picking the lowest-cost cow each time: use all coupons on the cheapest

cows, then buy as many cows as possible without coupons. However, this doesn't quite work: if several cows are very cheap with or without a coupon, and other cows are cheap with a coupon but very expensive without one, we can intuitively see that we would like to use our coupons on the more expensive cows. This leads to the idea of "revoking" a coupon: for cow i, we can pay (\(P_i-C_i\)) in order to regain one of our coupons (because we are now buying cow i at the "expensive" price).

After purchasing as many cows as possible with coupons, we store their (\(P_i-C_i\)) values in a heap.

To purchase a remaining cow j, we can either pay \(P_j\) or \(C_j\)+ (\(P_i-C_i\)), where cow i is the top cow in our heap.

This ensures we are always using exactly as many coupons as we can.

For each cow we add to our lineup, we are greedily paying the minimum possible amount for it, so this solution is clearly optimal.

这个题解是从USACO上找的

他什么意思呢

这个题目可以用贪心做

先买下所有用优惠券最便宜的奶牛

然后找出试图用原价比优惠价贵很多的奶牛去替代相对来说优惠价和原价相差较小的奶牛,这样就能省下更多钱

这个东西可以用堆维护

Bruce Merry's solution (implementing this idea) is below:

#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std; typedef long long ll; struct pqitem{
ll value;
int index;
bool operator<(const pqitem &b)const{
return value>b.value;
}
pqitem(ll value,int index):value(value),index(index){}
}; int main(){
int N,K;
ll M;
cin>>N>>K>>M;
vector<ll>P(N),C(N);
for(int i=0;i<N;i++)
cin>>P[i]>>C[i];
typedef priority_queue<pqitem> pqtype;
priority_queue<ll,vector<ll>,greater<ll> >recover;
pqtype cheap;
pqtype expensive;
for(int i=0;i<K;i++)
recover.push(0LL);
for(int i=0;i<N;i++){
cheap.push(pqitem(C[i],i));
expensive.push(pqitem(P[i],i));
}
vector<bool>used(N,false);
int nused=0;
while(M>0&&nused<N){
while(used[cheap.top().index])
cheap.pop();
while(used[expensive.top().index])
expensive.pop();
if(recover.top()+cheap.top().value<expensive.top().value){
const pqitem top=cheap.top();
ll cost=recover.top()+top.value;
if(M<cost)
break;
M-=cost;
recover.pop();
recover.push(P[top.index]-C[top.index]);
used[top.index]=true;
}
else{
const pqitem top=expensive.top();
ll cost=top.value;
if(M<cost)
break;
M-=cost;
used[top.index]=true;
}
nused++;
}
cout<<nused;
return 0;
}

USACO 2012 Feb Cow Coupons的更多相关文章

  1. [Usaco 2012 Feb]Cow coupons牛券:反悔型贪心

    Description Farmer  John  needs  new  cows! There  are  N  cows  for  sale (1 <= N <= 50,000), ...

  2. 2590: [Usaco2012 Feb]Cow Coupons

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

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

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

  4. [Usaco2012 Feb] Cow Coupons

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

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

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

  6. BZOJ2590 [Usaco2012 Feb]Cow Coupons

    好吧...想了半天想错了...虽然知道是贪心... 我们每次找没有被买的两种价格最小的牛,比较a = 当前差价最大的 + 当前优惠券价格最小的牛与b = 当前非优惠券价格最小的牛 所以...我们要 先 ...

  7. 【bzoj2591】[Usaco 2012 Feb]Nearby Cows 树形dp

    题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...

  8. 【贪心】【堆】bzoj2590 [Usaco2012 Feb]Cow Coupons

    每个物品有属性a,b 考虑在仅仅用光优惠券时的最优方案. 显然是按照b排序,取前K个. 但是我们还要尽可能去取剩余的. 假设朴素地取剩余的话,应该把剩余的对a排序,然后尽量去取. 但是有可能对其用优惠 ...

  9. BZOJ 1631 Usaco 2007 Feb. Cow Party

    [题解] 最短路裸题.. 本题要求出每个点到终点走最短路来回的距离,因此我们先跑一遍最短路得出每个点到终点的最短距离,然后把边反向再跑一遍最短路,两次结果之和即是答案. #include<cst ...

随机推荐

  1. C++ 递归读取目录下所有文件

    windows版本 #include <iostream> #include <io.h> #include <fstream> #include <stri ...

  2. HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)

    Problem Description Mex is a function on a set of integers, which is universally used for impartial ...

  3. IDE API SDK JDK

    一.IDE 英文全称:Integrated Development Environment 中文名称:集成开发环境 本质:应用程序 功能:提供程序开发环境 组成:代码编辑器.编译器.调试器.图形用户界 ...

  4. 漫谈单点登录(SSO)

    1. 摘要 ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,深感歉意!!!) SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开 ...

  5. 【历史】- Unix时代的开创者Ken Thompson

    自图灵奖诞生以来,其获得者一直都是计算机领域的科学家与学者,而在所有这些界的图灵奖中只有唯一的一届有个例外,那就是Ken Thompson与Dennis M. Ritchie,他们都是计算机软件工程师 ...

  6. 禁止 iphone 网页上下拖动露底

    document.addEventListener('touchmove', function(e) { e.preventDefault();});

  7. 判断当前系统当前浏览器是否安装启用 Adobe Flash Player,检查在chrome中的状态

    一.判断当前所在系统 let sUserAgent = navigator.userAgent;let isWin = (navigator.platform == "Win32" ...

  8. The 13th Zhejiang Provincial Collegiate Programming Contest - C

    Defuse the Bomb Time Limit: 2 Seconds      Memory Limit: 65536 KB The bomb is about to explode! Plea ...

  9. webstorm中把style的内容隐藏,如何把style的内容展开?

    我们经常看到在webstorm中style的内容以...表示如下图所示,只有把光标移到上面时才会看到内容: 如何把上述的style的内容展开呢? 请按一下步骤操作: 第一步:File------> ...

  10. 自旋锁、排队自旋锁、MCS锁、CLH锁

    转载自:http://coderbee.net/index.php/concurrent/20131115/577 自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他 ...