原题链接

ACwing

思路

看到区间上加减同一值的操作,容易想到使用差分预处理。原问题变成,如何通过(+1,-1)的成对操作,使得数组中所有数字变成0。

一个直观的策略是,对于每一个负数,我们应该通过其之前的正数将其抵消。根据差分的定义,,而,故而对于任何一个负数,一定可以找到一系列正数来与之抵消,我们的方法是合法的。其次,无论是哪一种方法,至少都需要将其中每一个负数变成正数,故而我们的方法是最优的。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;

const int N = 100000 + 10;
int D[N];
int a[N];
int main(){
int n;
cin>>n;

memset(a, 0, sizeof a);
memset(D, 0, sizeof D);
for(int i=1;i<=n;i++){
cin>>a[i];
D[i] = a[i] - a[i-1];
}

D[n+1] = -a[n];

int ans = 0;
for(int i=1;i<=n+1;i++){
if (D[i]<0)ans += -D[i];
}

cout<<ans<<endl;
return 0;
}