1. 程式人生 > >[NOIP2018D1T1][NOIP2013D1T1][Luogu P5019]鋪設道路

[NOIP2018D1T1][NOIP2013D1T1][Luogu P5019]鋪設道路

這道題其實很不錯(雖然我對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; }