2017.08.15【NOIP 普及组】模拟赛C组 猴子拆房

来源:互联网 发布:大数据支撑平台 编辑:程序博客网 时间:2024/06/14 17:24


思路:

题目描述

输入

输出

样例输入

【样例输入1】2 2 34 5【样例输入2】32 42 51 3【样例输入3】63 53 41 71 74 24 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

希望对大家有帮助!

无标程