Cow coupons

先说明做法:

首先将所有奶牛按照 c c c升序排序,那么最终答案一定包含 c c c最小的前 k k k个奶牛(如若不然,设前 k k k个奶牛中,第 i i i头奶牛没有在最终方案中,而最终方案中一定有一头用了优惠券的奶牛 j j j c c c i i i c c c大,于是我们不买 j j j,选择用优惠券买 i i i,显然用的钱更少)

开三个优先队列(都是小根堆) q , q 2 , q 3 q_,q_2,q_3 q,q2,q3,分别表示还没有购买的奶牛的原价,还没有购买的奶牛的优惠价以及已经购买了的且使用了优惠券的奶牛的原价减去优惠价

我们认为已经买了的奶牛是一定不会不买的,我们只需要考虑优惠券的转移;现在我们想要多买一头奶牛,如果我们用原价买这头奶牛,就选择 q 1 q_1 q1的堆顶,如果我们要用优惠券买这个奶牛,那么优惠券就要发生转移,于是考虑 q 2 q_2 q2的堆顶加上 q 3 q_3 q3的堆顶,并将新的用了优惠券的奶牛的原价减优惠价加入 q 3 q_3 q3,所以比较 q 1 q_1 q1的堆顶和 q 2 q_2 q2的堆顶加上 q 3 q_3 q3的堆顶即可;然后重复以上过程直到钱不够用了

以上只是直觉,缺少严格证明,下面证明:

假设我们已经买了的奶牛集合 A A A在最终方案中一定都会买(即不后悔奶牛是否买),并且对于已经买了的奶牛,优惠券的分配是最优的,那么如果我们想要多买一头奶牛,下面只分析 q 1 q_1 q1的堆顶小于 q 2 q_2 q2的堆顶加上 q 3 q_3 q3的堆顶(反之同理分析):设 q 1 q_1 q1堆顶代表的奶牛是 i i i,如果我们最终方案中不买 i i i,那么对于最终方案中不属于 A A A的奶牛,如果都是以原价买的,那么显然随便舍弃一头奶牛买 i i i都更优,如果存在奶牛 j j j用了优惠券,那么这个优惠券一定是从 A A A中用了优惠券的奶牛身上转移过来的,然而我们有 q 1 q_1 q1的堆顶小于 q 2 q_2 q2的堆顶加上 q 3 q_3 q3的堆顶, q 2 q_2 q2的堆顶加上 q 3 q_3 q3的堆顶小于将优惠券转移到 j j j上所产生的价格,所以 q 1 q_1 q1的堆顶小价格于将优惠券转移到 j j j上所产生的价格,于是我们将“将优惠券转移到 j j j上”变成“买 i i i并且不转移优惠券”显然是一种更优的方案,所以 i i i是一定要买的

update 2024.7.22

反悔贪心小结反悔贪心

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值