bzoj2590

来源:互联网 发布:南大网络教学平台 编辑:程序博客网 时间:2024/05/17 06:53

题意:
FJ准备买一些新奶牛,市场上有N头奶牛(1<=N<=50000),第i头奶牛价格为Pi(1<=Pi<=10^9)。FJ有K张优惠券,使用优惠券购买第i头奶牛时价格会降为Ci(1<=Ci<=Pi),每头奶牛只能使用一次优惠券。FJ想知道花不超过M(1<=M<=10^14)的钱最多可以买多少奶牛?
题解:
我觉得这题很玄(羞耻)。。
《论从解法推出正确性》
按c从小到大排序后,先取前k个的c,然后往后一个个决策。
维护用了c的min(p-c)=t这是省了的最少的钱
如果当前p-c>t,就代表如果我一定要加入,换掉那个c最优。否则用p最优。
算出最优方案价格s,如果小于等于m直接执行最优方案
如果大于m,什么样的情况下会踢人然后让我加入?
首先我不可能踢出一个用c的人。踢掉用c的人的意义在于让后面的人能用c,但后面的c一定比前面的大。
既然不能踢用c的人,我加入就只能用p,显然如果当前用了的最大的p’大于p,就会踢出他然后加入我。
维护一个p-c的小根堆,一个p的大根堆即可。

0 0