USACO 2012 Feb Cow Coupons
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的更多相关文章
- [Usaco 2012 Feb]Cow coupons牛券:反悔型贪心
Description Farmer John needs new cows! There are N cows for sale (1 <= N <= 50,000), ...
- 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 ...
- [Usaco2012 Feb] Cow Coupons
[Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- BZOJ2590 [Usaco2012 Feb]Cow Coupons
好吧...想了半天想错了...虽然知道是贪心... 我们每次找没有被买的两种价格最小的牛,比较a = 当前差价最大的 + 当前优惠券价格最小的牛与b = 当前非优惠券价格最小的牛 所以...我们要 先 ...
- 【bzoj2591】[Usaco 2012 Feb]Nearby Cows 树形dp
题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...
- 【贪心】【堆】bzoj2590 [Usaco2012 Feb]Cow Coupons
每个物品有属性a,b 考虑在仅仅用光优惠券时的最优方案. 显然是按照b排序,取前K个. 但是我们还要尽可能去取剩余的. 假设朴素地取剩余的话,应该把剩余的对a排序,然后尽量去取. 但是有可能对其用优惠 ...
- BZOJ 1631 Usaco 2007 Feb. Cow Party
[题解] 最短路裸题.. 本题要求出每个点到终点走最短路来回的距离,因此我们先跑一遍最短路得出每个点到终点的最短距离,然后把边反向再跑一遍最短路,两次结果之和即是答案. #include<cst ...
随机推荐
- BZOJ 1923 SDOI2010 外星千足虫 异或方程组+bitset
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1923 懒得贴题目了......这就是解一个异或方程组的裸题...... YY了一下异或方程 ...
- 关于配置tomcat多版本同eclipse的配置问题
最近很多同学都在反应tomcat和eclipse关联的问题,其他问题网上搜索下大多都有结果,有比较疑难杂症的,下面贴出: 有的同学之前配置过tomcat6的版本或者在此之前做过配置,现在配置tomca ...
- Chromium学习笔记
1. How to build chromium Follow the steps on:http://www.chromium.org/Home 需要安装Win7 x64的OS,PC的配置尽可能高端 ...
- incorrect integer value for column 问题解决
最近在用zend框架,然后装了一个项目,发现注册的时候出现 General error: 1366 Incorrect integer value: '' for column 'user_id' a ...
- capacilitys 持续集成
目前看好像是说以docker为例来看看这个权限到底是怎么来的? 可以通过在二进制上setcap得到,也可以通过函数自己用setcap得到,两种方法,docker肯定是第二种方法啊,docker中间肯定 ...
- iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- JSON语法(3)
JSON语法是JavaScript语法的子集. JSON语法规则 数据在名称/值对中 数据由逗号分割 花括号保存对象 方括号保存数组 JSON名称/值对 JSON数据的书写格式是:名称/值对. 名称/ ...
- 关于IE缓存
为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里.这个存放空间,我们就称它为IE缓存.以后我 ...
- [洛谷P4782]【模板】2-SAT 问题
题目大意:有$n$个布尔变量 $x_1 \sim x_n$,另有$m$个需要满足的条件,每个条件的形式都是"$x_i$ 为$true/false$或$x_j$为$true/false$&qu ...
- 深入了解一下Redis的内存模型!
一.前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字 ...