题目
Description
十一年前,北湖曾经是一片平整的土地,北湖的施工队打算将其挖出深坑,注水造出人工湖。
为了简化运算,我们假设北湖的地面是一维的,每一块宽度都为1,高度是非负整数,那么可以用一个数组来表达一块地面。
一开始北湖是一片平地,每一块的高度为h。下图是h=3的情况,用数组表示为[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
第一行输入两个整数。表示北湖的总宽度和初始每一块的高度。
接下来一行n个整数,表示图纸上每一个位置的高度。
Output
一个整数表示最少几天能将北湖挖好。
Notes
9天挖土的区间为[1,7],[1,3],[5,7],[1,1],[3,3],[6,6],[9,12],[10,10],[12,12]。
解题
思路
可以暴力求解,使用二维数组,但是时间复杂度较高。可以转化为较为简单的比较前后两个数字的大小,若后面一个数比前面大(地更高),则对结果无贡献,若更低,则天数要增加。
注意
特殊情况: 一马平川,注意第一天初始位置与h相比
代码
#include<stdio.h>
#include<string.h>
int main()
{
long arr[100009] = {0};
int n = 0,h = 0;
int max = -1;
scanf("%d %d",&n,&h);
for(int i = 0; i < n; i++)//存
{
scanf("%ld",&arr[i]);
}
long long day = h - arr[0];
for(int i = 0; i < n-1; i++)//计算
{
if(arr[i] > arr[i+1])
{
day = day + arr[i] - arr[i+1];
}
}
printf("%lld\n",day);
return 0;
}