基本思路:数组作差之后将连续的同号部分放在一起,再找最大值,也就是贪心
#include <bits/stdc++.h>
using namespace std;
const int M = 1e3 + 5;
int p[M], k[M];
vector<int>v1[M], v2[M];
int ans;
int n, p1 = 1, p2 = 1;
int main(void) {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &p[i]);
for (int i = 1; i <= n; ++i) {
scanf("%d", &k[i]);
k[i] -= p[i];
if (k[i] > 0) {
v1[p1].push_back(k[i]);
if (k[i - 1] < 0) p2++;
}
if (k[i] < 0) {
v2[p2].push_back(-k[i]);
if (k[i - 1] > 0) p1++;
}
if (k[i] == 0) {
if (!v1[p1].empty())
p1++;
if (!v2[p2].empty())
p2++;
}
}
for (int i = 1; i <= p1; ++i) {
int maxx = 0;
for (int j = 0; j < (int)v1[i].size(); ++j)
maxx = max(maxx, v1[i][j]);
ans += maxx;
}
for (int i = 1; i <= p2; ++i) {
int maxx = 0;
for (int j = 0; j < (int)v2[i].size(); ++j)
maxx = max(maxx, v2[i][j]);
ans += maxx;
}
printf("%d", ans);
return 0;
}