int n; cin >> n; vector<int> a(n + 1), pre(n + 1); for (int i = 1; i <= n; ++i) { cin >> a[i]; pre[i] = pre[i - 1] + a[i]; }
int mx1 = 0, mx2 = 0; for (int i = 1; i <= n; ++i) { int x = pre[i - 1] - i * (i - 1); mx1 = max(x, mx1); x = i * (i + 1) - pre[i]; mx2 = max(x, mx2); }
cout << pre[n] + mx1 + mx2 << endl; }
intmain(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); return0; }
这是错的,因为L要小于R,而我取了全局最大:
1 2 3 4 5 6 7
int mx1 = 0, mx2 = 0; for (int i = 1; i <= n; ++i) { int x = pre[i - 1] - i * (i - 1); mx1 = max(x, mx1); x = i * (i + 1) - pre[i]; mx2 = max(x, mx2); }
正解是:
1 2 3 4 5 6 7
int mx = 0, ans = 0; for (int i = 1; i <= n; ++i) { int x = pre[i - 1] - i * (i - 1); mx = max(x, mx); x = i * (i + 1) - pre[i] + mx; ans = max(x, ans); }
int n; cin >> n; vector<int> a(n + 1), pre(n + 1); for (int i = 1; i <= n; ++i) { cin >> a[i]; pre[i] = pre[i - 1] + a[i]; }
int mx = 0, ans = 0; for (int i = 1; i <= n; ++i) { int x = pre[i - 1] - i * (i - 1); mx = max(x, mx); x = i * (i + 1) - pre[i] + mx; ans = max(x, ans); }
cout << pre[n] + ans << endl; }
intmain(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int _ = 1; cin >> _; while (_--) solve(); return0; }
#include<bits/stdc++.h> usingnamespace std; constint N=1e9+5; voidsolve(){ int n; cin >> n; vector<int> a(n + 1), b(n + 1); longlong sum = 0; for (int i = 1; i <= n; ++i) { cin >> a[i]; sum += a[i]; b[i] = 2 * i - a[i]; } longlong ans = 0, tot = 0; for (int i = 1; i <= n; ++i) { tot = max(0LL, tot + b[i]); ans = max(tot, ans); }
cout << ans + sum << endl;
} intmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int _=1; cin>>_; while(_--) solve(); return0; }