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 ...
随机推荐
- NO6——KMP
int next[N]; char str1[M],str2[N]; //str1 长,str2 短 //len1,len2,对应str1,str2的长 void get_next(int len2) ...
- SSH答疑解惑系列(二)——java.lang.reflect.InvocationTargetException异常
在项目中遇到了invocationTargetException的问题,在这里跟大家分享一下. 报错信息如下: 使用反射时,比如执行invoke方法,如果被反射执行的方法体抛出了Exception,这 ...
- Concurrent.util中的一些类
package com.bjsxt.height.concurrent019; import java.io.IOException; import java.util.Random; import ...
- js表单验证工具包
常用的js表单验证方法大全 /* 非空校验 : isNull() 是否是数字: isNumber(field) trim函数: trim() lTrim() rTrim() 校验字符串是否为空: ch ...
- 【bzoj3196】Tyvj 1730 二逼平衡树 线段树套Treap
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义 ...
- ARC075 F.Mirrored
题目大意:给定D,询问有多少个数,它的翻转减去它本身等于D 题解做法很无脑,利用的是2^(L/2)的dfs,妥妥超时 于是找到了一种神奇的做法. #include <iostream> u ...
- [洛谷P3693]琪露诺的冰雪小屋
题目大意:琪露诺的冰雪小屋,我做的第一道大模拟题. 题解:模拟... 卡点:无数小错误,要是没有写一点调一点,那大概是永远调不出来了... C++ Code: #include <cstdio& ...
- MFC 相关类、函数
timeSetEvent()函数 CRectTracker类的使用 SetLocalTime设置本地时间 AdjustTokenPrivileges启用权限
- BZOJ1191:超级英雄(二分图匹配)
[HNOI2006]超级英雄Hero 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 Description: 现在电视台有一种节 ...
- mysql修改表中某个字段的默认值
Mysql中用SQL增加.删除字段,修改字段名.字段类型.注释,调整字段顺序总结 在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改 ...