1 条题解
-
0
- 首先解决不是环形的情况
- 如果最后要取环形子数组的和最大,其实 相当于中间一子数组的和最小
- 注意特判全负数的情况,因为此时取最小会取整个数组,我们要的数组就是空了
#include <bits/stdc++.h> using namespace std; int maxSum(const vector<int>& a) { int n = a.size(), ans = a[0], now = a[0]; // now: 以 a(i) 结尾的最大子数组和 for (int i = 1; i < n; i++) { now = max(a[i], now + a[i]); ans = max(ans, now); } return ans; } int solve(vector<int>& a) { int n = a.size(), ans = maxSum(a); // 说明数组全是负数 if (ans < 0) return ans; // 如果最后取环形, 相当于取中间一段最小 // 考虑把 a 全部取反, 再求 maxSum() 就好 // 注意上面特判全负数的情况 int sum = accumulate(a.begin(), a.end(), 0); for (int i = 0; i < n; i++) a[i] = -a[i]; ans = max(ans, sum + maxSum(a)); return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; cout << solve(a) << '\n'; return 0; }
- 1
信息
- ID
- 176
- 时间
- 100ms
- 内存
- 32MiB
- 难度
- 5
- 标签
- 递交数
- 59
- 已通过
- 22
- 上传者