传送门:https://vijos.org/d/jcsy/p/58b2b8bad3d8a123ab08db9f
这是一道贪心题,主要由2部分组成
1、首先最优情况必定是k张优惠券全部用完,那么先按优惠价排序,排出来前k个优惠价之和如果比m大,则从小到大按优惠价能买几个买几个,然后输出
2、然后考虑如果步骤1后前k个都买下并还有钱剩余,则可能可以再多买,
但是:
前k个必定不能扔掉:一旦某个被扔掉,则只能省下1张优惠券,这张优惠券用于新的物品要花的钱必定比留下那个扔掉的要多
所以要加入新的只有两种可能:
(1)从已有的取出一张优惠券用于加入新的物品(此时新的优惠价要最小,并且被取出优惠券的物品优惠价与原价之差要最小)
(2)用原价加入新的物品(此时新的原价要最小)
从(1)(2)中取较优状态用于加入
那么为了维护已加入物品优惠价与原价之差最小,可以用堆
以下代码
#include<iostream>
#include<cstdio>
#include<cstring>