思路:
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),可過,較爲簡單!
思路較爲簡單,考實現能力!
程序框架:
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
希望對大家有幫助!
無標程