-
题目:
问题描述
THU幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。
在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间[L, R],然后将第L块到第R块之间(含第L块和第R块)所有积木的高度分别增加1。
kAc是个聪明的小朋友,他很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但他不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。输入格式
输入包含两行,第一行包含一个整数n,表示大厦的宽度。
第二行包含n个整数,第i个整数为hi。输出格式
仅一行,即建造所需的最少操作数。
样例输入
5
2 3 4 1 2样例输出
5
-
题目解释:
- 这道题意思是建造一个宽为n的大厦,这个宽为n是由n个宽为1的积木构成,然后要从高度为0开始搭建出高度为hi(就是题目所给的各块积木的高度)为止。
- 然后我们要求的是最小的操作次数(意思就是要放多少次积木才能达到题目所给的各高度),每一次操作可以在一个连续的区间内同时放上积木。
- 从题目给出的样例,就是开始时宽度为1道宽度为5的积木高度全为0。
- 然后第一次从1-5同时放入1块积木,是他们高度均为1,即hi=[1,1,1,1,1]
- 然后第二次,由于宽度为4已经达到了高度要求,所以第二次增高的连续区间只能是宽度为1-宽度为3均增加一块积木(高度+1),即hi=[2,2,2,1,1]
- 第三次,宽为1的积木已到达高度,然后对宽为2-宽为3的积木+1,即hi=[2,3,3,1,1]
- 第四次只对宽为3处的积木高度+1(因为已经没有连续区间可以同时叠加了),第五次就只对宽度为5处的积木高度+1,最后即hi=[2,3,4,1,2]
- 所以最后是操作5次。
-
思路:
- 按照上方的解释,其实就是后一块积木比前一块积木高多少,就加几次。
- 因为前一块积木再加高度时后面的积木跟着加,然后后面的比前面的高多少,后面的自己就补多少高度。
-
代码:
package BlueBridge;
import java.util.Scanner;
public class BuildingBlockContest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n+1];
for (int i = 1; i < nums.length; i++) {
nums[i] = in.nextInt();
}
int sum = 0;
for (int i = 1; i < nums.length; i++) {
if(nums[i]>nums[i-1])
sum = nums[i]-nums[i-1]+sum;
}
System.out.println(sum);
in.close();
}
}
(有错误欢迎指正哈,如果有不小心侵权的联系删除哈😁)