积木大赛

题目

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

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

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

输入格式

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

第二行包含nn个整数,第i个整数为h_ihi​。

输出格式

建造所需的最少操作数。

 

 

分析&题解

本来以为很简单,结果想了一天都没解....

思路就是研究第i个点,如果它大于第i-1个点,那么就必须要将多出来的单独建几个区间刷一次,否则,就可以刷i-1个点的同时可以顺带解决i,就没有贡献了

一种贪心的局部思想

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
const int MAXN = 100003;
int n;
int a[MAXN];
int ans , t;
int main(){
    scanf( "%d" , &n );
    for( int i = 1 ; i <= n ; i ++ ){
        scanf( "%d" , &a[i] );
        if( a[i] > t ) ans += a[i] - t;
        t = a[i];
    }
    printf( "%d\n" , ans );
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页