计蒜客-2016-积木大赛(贪心)

春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为 nn 的大厦,大厦可以看成由 nn 块宽度为 11 的积木组成,第 ii 块积木的最终高度需要是 h_ih
i

在搭建开始之前,没有任何积木(可以看成块高度为 00 的积木)。接下来每次操作,小朋友们可以选择一段连续区间 [L,R][L,R],然后将第 LL 块到第 RR 块之间(含第 LL 块和第 RR 块)所有积木的高度分别增加 11。

小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入格式
输入包含两行,第一行包含一个整数 nn,表示大厦的宽度。

输出格式
仅一行,即建造所需的最少操作数。

数据范围
对于 3030% 的数据,有 1 \le n \le 101≤n≤10;

对于 7070% 的数据,有 1 \le n \le 10001≤n≤1000;

对于 100100% 的数据,有 1 \le n \le 1000001≤n≤100000,0 \le h_i \le 100000≤h
i

≤10000。

样例说明
其中一种可行的最佳方案,依次选择 [1,5][1,5]、[1,3][1,3]、[2,3][2,3]、[3,3][3,3]、[5,5][5,5]。

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制
5
2 3 4 1 2
样例输出复制
5

我们假设宽度为1,那么盖楼的次数就是高度,那么如果宽度为2,如果前面的和后面一样高,那么就只需要同样的次数,如果前面的高于后面,那么就等于前面,如果后面高于前面,那么就为后面的,同时,如果两个高的中间有一个矮的,那么就会将前后分隔,故而就需要前后独立计算,并且中间矮的那个肯定在之前的次数中就已经被填过了,而后面的因为中间的阻隔就没有被填过,所以就是一个贪心,代码如下:

//@author:hairu,wu
//@from:ahut
#include<iostream>
using namespace std;

int a[100100];

int main(){
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	int now=a[1];
	int ans=a[1];
	for(int i=2;i<=n;i++){
		if(a[i]>now){
			ans+=a[i]-now;
		}
		now=a[i];
	}
	cout<<ans<<endl;
	return 0;
}
发布了83 篇原创文章 · 获赞 3 · 访问量 1374

猜你喜欢

转载自blog.csdn.net/weixin_41296877/article/details/105205838