思路很简单,负数或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;
}