样例过10pts,求条
查看原帖
样例过10pts,求条
1070264
TheRangerNick楼主2024/10/5 17:22

基本思路:数组作差之后将连续的同号部分放在一起,再找最大值,也就是贪心

#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;
}
2024/10/5 17:22
加载中...