思路:
2186. 猴子拆房
(File IO): input:house.in output:house.out
Goto ProblemSet
呵呵哒。。。。
思路:
第一层思路:暴力o(n^2),超时;
第二层思路:高度从大到小排序,所有数加入堆,利用sum求出以h[i]为最高高度的所有大于h[i]的c[i]之和(很绕),每次做完后sum加上所有当前=h[i]的c[i]之和。大根堆维护最大值,连取d[i]-1(h[i]有几个)个,再用g(堆里所有数之和)-g1(被取的最大值之和)求出f[i]为最高高度下面的最优解。sum+g-g1为上下最优解之和。每次做完后,将h[i],c[i]退堆。答案为min(sum+g-g1)。时间复杂度O(n log n),可过,但有些复杂。。。。
第三层思路(先看懂第二层):高度从小到大排序!这样加入堆的都有用,复杂(猥琐)的退堆省略;仍是大根堆维护最大值,g-g1方法没变。以h[i]为最高高度上面的c[i]之和用sum储存,sum初值为c[i]之和。每次sum减以h[i]为高度的c[i]之和,答案同上。时间复杂度o(n log n),可过,较为简单!
思路较为简单,考实现能力!
程序框架:
扫描二维码关注公众号,回复:
1760602 查看本文章
1,定义变量;
2,快排(5)后;
3,up操作;
4,down操作;
5,读入;
6,快排后求需要的值(如sum等);
7,o(n)枚举循环;
8,sum减;
9,ans=sum;
10,求出h[i]下面的最优解;
11,ans:=ans+下面最优解;
12,取ans的min
13,输出min
希望对大家有帮助!
无标程