Description
十一年前,北湖曾经是一片平整的土地,北湖的施工队打算将其挖出深坑,注水造出人工湖。
为了简化运算,我们假设北湖的地面是一维的,每一块宽度都为1,高度是非负整数,那么可以用一个数组来表达一块地面。
一开始北湖是一片平地,每一块的高度为
。下图是
的情况,用数组表示为[3,3,3,3,3,3,3,3,3,3,3,3]。
施工队根据图纸想将其挖成凹凸不平的形状,如下图所示,数组表示为[0,1,0,2,1,0,1,3,2,1,2,1]。
施工队有一台挖土机,每一天挖土机可以将连续一段区间挖掉一格土。包工头小张想尽快完成任务,请你告诉他将平整的土地挖成图纸所示的情况最少需要多少天?
Input
第一行输入两个整数
。表示北湖的总宽度和初始每一块的高度。
接下来一行
个整数
,表示图纸上每一个位置的高度。
Output
一个整数表示最少几天能将北湖挖好。
Notes
9天挖土的区间为[1,7],[1,3],[5,7],[1,1],[3,3],[6,6],[9,12],[10,10],[12,12]。
思路
用了old和new两个数组分别表土地初始状态和挖后状态,
在初始状态下对应减去每一块土地的挖后状态可以得到每一块土地需要挖掉的格数。
把初始化天数定义为第一块土地需要挖掉的格数(old[1]),然后用循环遍历后续数组:
若old[i]<=old[i-1],又因为在循环中遍历的是连续的一段区间,则说明第i块土地在之前已经被一起挖掉;
反之,则需要old[i]-old[i-1]天挖掉多出的土地格数。
注意事项
注意变量的数量级,都要用long long int.
整体代码
#include <stdio.h>
int main() {
long long n, h;
scanf("%lld %lld", &n, &h);
long long i = 0;
long long old[100001], new[100001];
for (i = 1; i <= n; i++) {
old[i] = h;
}
for (i = 1; i <= n; i++) {
scanf("%lld", &h);
new[i] = h;
old[i] -= new[i];
}
long long day = old[1];
for (i = 2; i <= n; i++) {
if (old[i] >= old[i - 1]) day += old[i] - old[i - 1];
}
printf("%lld\n", day);
return 0;
}