1. 程式人生 > >【NOIP2018】【Luogu5019】鋪設道路(貪心,差分)

【NOIP2018】【Luogu5019】鋪設道路(貪心,差分)

problem

  • 給定一個目標序列,每次操作可以將一個區間全部減1。
  • 求最少運算元使序列變為全0。

solution

講個笑話,NOIP2013中DAY1T1的程式碼直接複製貼上都能過這題。

  • 考慮區間減法:我們用差分,即d[l]--,d[r+1]++表示區間[l,r]全都減1.
  • 考慮最終序列(全都為0):所以對於d[i]為正,答案累加d[i], 因為最後是0,所以我們一定要減掉d[i]。對於d[i]為負,不用管,因為減掉整數肯定會在正確的位置自己加上,所以正好會抵消。
  • 所以最終答案就是差分數列中正數的和。

codes

#include
<iostream>
using namespace std; const int maxn = 100010; int n, a[maxn], d[maxn], ans; int main(){ cin>>n; for(int i = 1; i <= n; i++){ cin>>a[i]; d[i] = a[i]-a[i-1]; if(d[i]>0)ans += d[i]; } cout<<ans<<'\n'; return 0; }