每日一题:Functions again

题意

给定数组,求上述式子的最大值。

Solution

可以看出,上述式子是交替加减求最大子段和。预处理两项差的绝对值,那么只需要枚举起点是奇数位置还是偶数位置就可以了,根据贪心原则,起点肯定选正数,然后交替正负就好了,这样问题就转化成就求最大子段和了,贪心即可。

Code

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
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
int n;
ll a[N], b[N], d[N];

ll solve(ll c[]) {
ll now = 0, ma = 0;
for (int i = 2; i <= n; i++) {
if (now <= 0)
now = c[i];
else
now += c[i];
ma = max(ma, now);
}
return ma;
}

int main() {
cin >> n >> a[1];
for (int i = 2; i <= n; i++) {
cin >> a[i];
ll x = llabs(a[i] - a[i - 1]);
if (i & 1)
b[i] = -x;
else
b[i] = x;
d[i] = -b[i];
}
cout << max(solve(b), solve(d)) << endl;
return 0;
}
作者

Benboby

发布于

2020-08-10

更新于

2021-02-04

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×