思路很简单,负数或0加到全局,正数加到最大的数,排序后从小到大依次处理。C++代码很短。注意到某些正数加了负数之后可能会变成负数或0,继续加到全局即可。
#include <bits/stdc++.h>
using int64 = int64_t;
using namespace std;
int main() {
int tt = 1;
cin >> tt;
while (tt--) [&]()->void {
int n; cin >> n;
vector<int64> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
sort(a.begin(), a.end());
int64 cur = 0;
for (int i = 0; i < n; ++i) {
a[i] += cur;
if (a[i] <= 0) {
cur += a[i];
} else if (i < n - 1) {
a.back() += a[i];
}
}
cout << a.back() << '\n';
}() ;
return 0;
}

京公网安备 11010502036488号