luogu1969 積木大賽
阿新 • • 發佈:2018-05-29
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 積木大賽