2017.08.15【NOIP 普及組】模擬賽C組 猴子拆房


思路:

題目描述

輸入

輸出

樣例輸入

【樣例輸入1】
2 
2 3
4 5

【樣例輸入2】
3
2 4
2 5
1 3

【樣例輸入3】
6
3 5
3 4
1 7
1 7
4 2
4 1

樣例輸出

【樣例輸出1】
3

【樣例輸出2】
0

【樣例輸出3】
10

數據範圍限制

提示

呵呵噠。。。。

思路:

第一層思路:暴力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

希望對大家有幫助!

無標程



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章