博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO[CowCoupons]
阅读量:5289 次
发布时间:2019-06-14

本文共 2109 字,大约阅读时间需要 7 分钟。

这题是个非常棒的贪心题,唯一的缺点是数据太水了,强烈要求加强数据.(当然我知道在这里喊不会有人鸟我...)

这个题相信有些人的第一思路是按优惠后价格排序,能买就买,但这显然是错误的.
比如你有两头牛和一张优惠券,两头牛优惠前和优惠后的价格分别是\({50,1}\)\({10000,25}\).
这样应该很显然.

那我们就可以考虑去在哪些牛身上用优惠券是最值的.一个思路是先按上面的做法取\(k\)头牛,然后再对剩下的牛逐一考虑是否把优惠券用到这头牛上更优.

一个非常简单的思路是回溯,但这显然不太行是叭...复杂度上天系列.
那我们考虑,一头牛相比另一头牛使用优惠券更优的条件是如何的.
不难发现,如果对于两头牛\(i,j\),有\[c_i+p_j < c_j + p_i\]那么显然把优惠券使用在\(i\)这头牛会比较优.
那么移一下项,发现这个东西变成了这个\[p_i - c_i > p_j - c_j\],所以我们把之前每个先钦定使用优惠券的牛的这个东西压入小根堆中,再逐一考虑后面的牛即可.
不过判断的时候我还是用了最开始的结论.需要注意的是,在考虑后几头牛的时候,要按原价排一遍序,因为如果没有优惠券了,而你还有钱,显然这样买比较优.
\(Code:\)

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MEM(x,y) memset ( x , y , sizeof ( x ) )#define rep(i,a,b) for (int i = a ; i <= b ; ++ i)#define per(i,a,b) for (int i = a ; i >= b ; -- i)#define int long long#define pii pair < int , int >#define X first#define Y secondusing std::pair ;using std::max ;using std::min ;using std::priority_queue ;using std::vector ;const int N = 5e4 + 100 ;priority_queue < pii , vector < pii > , std::greater < pii > > q ;int n , k , m , tot , ans ;pii cow[N] ;inline bool cmp (pii a , pii b) { if ( a.Y != b.Y ) return a.Y < b.Y ; return a.X < b.X ;}signed main () { scanf ("%lld%lld%lld" , & n , & k , & m ) ; ans = tot = 0 ; rep ( i , 1 , n ) scanf ("%lld%lld" , & cow[i].Y , & cow[i].X ) ; // P C std::sort ( cow + 1 , cow + n + 1 ) ; rep ( i , 1 , k ) { tot += cow[i].X ; ++ ans ; if ( tot > m ) { printf ("%lld\n" , i - 1 ) ; return 0 ; } q.push ( { cow[i].Y - cow[i].X , i } ) ; } ans = k ; std::sort ( cow + k + 1 , cow + n + 1 , cmp ) ; rep ( i , k + 1 , n ) { pii tmp = q.top () ; if ( cow[tmp.Y].X + cow[i].Y > cow[tmp.Y].Y + cow[i].X ) { ++ ans ; tot -= cow[tmp.Y].X ; tot += ( cow[i].X + cow[tmp.Y].Y ) ; q.pop () ; q.push ( { cow[i].Y - cow[i].X , i } ) ; } else { ++ ans ; tot += cow[i].Y ; } if ( tot > m ) { printf ("%lld\n" , ans - 1 ) ; return 0 ; } } printf ("%lld\n" , n ) ; system ("pause") ; return 0 ;}

转载于:https://www.cnblogs.com/Equinox-Flower/p/11402156.html

你可能感兴趣的文章
(区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)
查看>>
计算机四级网络工程师复习提纲
查看>>
SQL总结
查看>>
Python2.7-bz2
查看>>
CoderForce 140C-New Year Snowmen(贪心)
查看>>
二十年来寻刀剑,几回落叶又抽枝
查看>>
Linux下的高级拾色器—Pick
查看>>
jadclipse安装下载
查看>>
HashMap底层原理及方法实现
查看>>
jquery vticker (vertical news ticker)
查看>>
AFNetwork swift版Alamofire使用问题集锦
查看>>
win10下设置IIS、安装php7.2
查看>>
ASP.NET MVC之验证终结者篇
查看>>
ContentProvider的学习和使用实例
查看>>
NULL指针\零指针、野指针
查看>>
car
查看>>
xml中处理大于小与符号
查看>>
网络七层模型&&网络数据包
查看>>
JavaScript基础---获取元素的属性(title,style,width)
查看>>
Django的认证系统
查看>>