[NOIP2018D1T1][NOIP2013D1T1][Luogu P5019]鋪設道路
阿新 • • 發佈:2018-12-30
這道題其實很不錯(雖然我對CCF抄自己的題這種行為很反感)。
我推了1個多小時的公式終於AC了。
可以用DP來解決此題。
設 $ dp[i] $ 為鋪設前 $ i $ 塊區域所需要的天數。
可以分類討論一下。
如果 $ d[i] \le d[i-1] $,
那麼 $ dp[i]=dp[i-1] $。
因為在鋪設第 $ i-1 $ 塊區域時就已經鋪設好了第 $ i $ 塊區域。
反之,如果 $ d[i] > d[i-1] $,
那麼 $ dp[i]=dp[i-1]+d[i]-d[i-1] $。
因為在鋪設完第 $ i -1 $ 塊區域時,第 $ i $ 塊區域還需要鋪設 $ d[i]-d[i-1] $ 天。
最後輸出 $ dp[n] $ 即可。
$ \rm code $
# include <bits/stdc++.h> const int maxN = 1e5 + 10; int d[maxN]; int dp[maxN]; int n; using namespace std; namespace Aehnuwx { void init() { scanf("%d", &n); for(register int i = 1; i <= n; i ++) scanf("%d", &d[i]); } int work(); //void work(); int work() { for(int i = 1; i <= n; i ++) if(d[i] <= d[i - 1]) dp[i] = dp[i - 1]; else dp[i] = dp[i - 1] + d[i] - d[i - 1]; return dp[n]; } }; using namespace Aehnuwx; int main() { Aehnuwx::init(); printf("%d", Aehnuwx::work()); return 0; }