先说明做法:
首先将所有奶牛按照升序排序,那么最终答案一定包含最小的前个奶牛(如若不然,设前个奶牛中,第头奶牛没有在最终方案中,而最终方案中一定有一头用了优惠券的奶牛的比的大,于是我们不买,选择用优惠券买,显然用的钱更少)
开三个优先队列(都是小根堆),分别表示还没有购买的奶牛的原价,还没有购买的奶牛的优惠价以及已经购买了的且使用了优惠券的奶牛的原价减去优惠价
我们认为已经买了的奶牛是一定不会不买的,我们只需要考虑优惠券的转移;现在我们想要多买一头奶牛,如果我们用原价买这头奶牛,就选择的堆顶,如果我们要用优惠券买这个奶牛,那么优惠券就要发生转移,于是考虑的堆顶加上的堆顶,并将新的用了优惠券的奶牛的原价减优惠价加入,所以比较的堆顶和的堆顶加上的堆顶即可;然后重复以上过程直到钱不够用了
以上只是直觉,缺少严格证明,下面证明:
假设我们已经买了的奶牛集合在最终方案中一定都会买(这里利用数学归纳法证明,Base是成立的,因为我们最开始是按照升序排序的,已经说明了前个奶牛一定会买的),并且对于已经买了的奶牛,优惠券的分配是最优的,那么如果我们想要多买一头奶牛,下面只分析的堆顶小于的堆顶加上的堆顶(反之同理分析):设堆顶代表的奶牛是,如果我们最终方案中不买,那么对于最终方案中不属于的奶牛,如果都是以原价买的,那么显然随便舍弃一头奶牛买都更优,如果存在奶牛用了优惠券,那么这个优惠券一定是从中用了优惠券的奶牛身上转移过来的,然而我们有的堆顶小于的堆顶加上的堆顶,的堆顶加上的堆顶小于将优惠券转移到上所产生的价格,所以的堆顶小价格于将优惠券转移到上所产生的价格,于是我们将“将优惠券转移到上”变成“买并且不转移优惠券”显然是一种更优的方案,所以是一定要买的。并且此时优惠券的分配也是最优的
update 2024.7.22
反悔贪心小结,反悔贪心
update 2025.1.8
想到了按升序排序并且前个奶牛一定会买,但是剩下这个太难了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构