cf2173 B题解

22 阅读1分钟

题目

Problem - B - Codeforces

看到这个题目的第一反应是贪心,即每次选择都取最大值,快速地写完,提交,WA了! 于是我回去仔细看了看题目,发现a[i],b[i]可以为负数,所以可能会出现减去一个负数后总得分反而大于我们所求的最大值。

所以,我们应该每次求出最大值和最小值。

AC代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 8;
int a[N];int b[N];
void solve() {
	int n;
	cin >> n ;
	for (int i = 1;i <= n;i++) cin >> a[i];
	for (int i = 1;i <= n;i++) cin >> b[i];
	int maxx = 0, minn = 0;
	for (int i = 1;i <= n;i++) {
		int nmax = max(maxx - a[i], b[i] - minn);//新的最大值
		int nmin = min(minn - a[i], b[i] - maxx);//新的最小值
		maxx = nmax;minn = nmin;//更新
	}
	cout << maxx << endl;
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

时间复杂度为O(n)。

完结撒花:)