每一处最多用一张令牌,目标是让封堵和引流省下的水量尽量多,剩下暂缓的总和尽量小。把各点渗水量从大到小排序后贪心分配即可。
古建修复工坊接到一段夯土墙的渗水排查任务。工头需要在一次巡检里处理全部渗水点,使墙面残留的渗水量之和尽量小,并把这个最小值报给修复档案。
墙面上从左到右有 k 处渗水点,第 i 处的渗水量是整数 hi。工坊按规程下发了 u 张封堵令和 v 张引流令,每张令牌只能用在一个渗水点上,用过即作废。巡检时,对每一处渗水点必须且只能选下面三种处置之一:
1 张封堵令,该点渗水被完全截断,残留水量为 0。1 张引流令,按固定幅度 g 把水引走,该点残留水量为 max(0, hi−g)。同一处不能既封堵又引流。请合理分配令牌,使 k 处残留水量之和最小。
渗水点个数 k 满足 1≤k≤ 200000,封堵令张数 u 与引流令张数 v 满足 0≤u,v≤k,引流幅度 g 满足 1≤g≤ 1000000000,各点渗水量满足 0≤hi≤ 1000000000。
第一行四个整数 k、u、v、g(1≤k≤ 200000,0≤u,v≤k,1≤g≤ 1000000000),依次表示渗水点数、封堵令张数、引流令张数和引流幅度。
第二行 k 个整数 h1,h2,…,hk(0≤hi≤ 1000000000),表示各点渗水量。
输出一个整数,即最优分配下的最小残留水量之和。
输入
4 1 1 5
12 3 9 1
输出
8
说明
渗水量从大到小是 12、9、3、1。封堵令用在 12 上,残留为 0;引流令用在 9 上,残留为 max(0, 9−5)=4;剩下 3 和 1 暂缓。总和为 0+4+3+1=8。
输入
3 0 2 10
4 25 6
输出
19
说明
没有封堵令,两张引流令应给最大的两处:25 变成 15,6 变成 0,4 暂缓,总和为 19。
输入
1 0 0 1
0
输出
0
说明
只有一处渗水量为 0,也没有任何令牌,残留仍为 0。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.