题目
看到这个题目的第一反应是贪心,即每次选择都取最大值,快速地写完,提交,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)。