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),可过,较为简单!

思路较为简单,考实现能力!

程序框架:

扫描二维码关注公众号,回复: 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

希望对大家有帮助!

无标程



猜你喜欢

转载自blog.csdn.net/wangyuda123456789/article/details/77199703