1. 程式人生 > >luogu1969 積木大賽

luogu1969 積木大賽

for 一個 class CP pre %d scan std string

題目大意

搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。
在搭建開始之前,沒有任何積木(可以看成n塊高度為 0 的積木)。接下來每次操作,可以選擇一段連續區間[l, r],然後將第 L 塊到第 R 塊之間(含第 L 塊和第 R 塊)所有積木的高度分別增加1。求操作的最小次數。

思路

題目可以看成給定幾個大廈,問題至少要砍幾刀才能把大廈砍沒。我們思路不在於砍的過程,而在於何時會多砍。從左往右掃描,當山勢(當前大廈與前一個大廈高度差)變低時,砍的刀數不增加,因為要砍掉前一個大廈必然會要砍到與當前大廈同一層的位置,砍前一個大廈時砍深一點即可。當山勢變高時,你不得不多砍幾刀才能把多出的一塊砍掉。

#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
    int n, ans = 0, curH, prevH = 0;
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &curH);
        if(curH > prevH)
            ans += (curH - prevH);
        prevH = curH;
    }
    printf("
%d\n", ans); return 0; }

luogu1969 積木大賽