# Greedy# Iteration

e332 - NOIP2018 Day1.1.铺设道路

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算將一條長度為 n 的道路上每個區域的下陷深度降低到 0 所需的最少天數。道路由 n 個相鄰的區域組成,每個區域的初始下陷深度為 di。每天可以選擇一個連續區間 [L, R],並將該區間內每個區域的下陷深度減少 1,但前提是該區間內所有區域的初始下陷深度均不為 0。

解題思路

這個問題可以使用貪心策略來解決。我們可以遍歷道路上的每個區域,如果當前區域的下陷深度大於前一個區域的下陷深度,則需要額外的一天來填充從前一個區域到當前區域的間隔。因為如果我們不這樣做,我們將不得不多次填充相同的區域。

具體來說,我們維護一個變數 t1,表示前一個區域的下陷深度。對於當前區域的下陷深度 t,如果 t > t1,則需要額外的一天來填充間隔,因此將答案 ans 增加 t - t1。然後,將 t1 更新為 t,繼續遍歷下一個區域。

複雜度分析

  • 時間複雜度: O(n)
  • 空間複雜度: O(1)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
inline int read(){
	int a(0);
	char c('0');
	while(c>='0'){
		a=(a<<3)+(a<<1)+c-'0';
		c=getchar_unlocked();
	}
	return a;
}
inline void write(int x) {
	int stk[9],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int main(){
	int n(read()),t,t1(0),ans(0);
	while(n--){
		t=read();
		(t>t1)&&(ans+=t-t1);
		t1=t;
	}
	write(ans);
}

Discussion