题目链接: codeforces 1405 B. Array Cancellation
题意:
t组测试用例 1 <= t <= 5000
1 <= n <= 100000 -1000000000 <= a[i] <= 1000000000
给一个长度为n的数组,对于不同坐标的元素,可以进行如下操作:
a[i] - 1 并且 a[j] + 1
如果i < j,操作免费
如果i > j,花费1硬币
最少花费多少硬币使整个数组都变成0
例: n = 4
-3 5 -3 1
第一步 三次免费操作 -3 2 0 1 a[1]-3 a[2]+3 i < j
第二步 两次花费操作 -1 0 0 1 a[0]+2 a[1]-3 i > j
第三步 一次花费操作 0 0 0 0 a[0]+1 a[3]-1 i > j
解题思路:
那肯定是先进行免费操作,再进行花费操作。但是如何快速求呢?
求前缀和,如果前缀小于0时,说明左边的负数多,需要进行花费操作,而且是无法避免的。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int a[maxn];
long long ans;
int main(){
int t;
cin >> t;
while(t--) {
int n;
long long sum = 0;
cin >> n;
ans = 1e9+5;
for(int i = 1; i <= n; i++) {
cin >> a[i];
sum = sum + a[i];
if(sum < 0) {
ans = min(ans, sum);
}
}
if(ans == 1e9+5){
ans = 0;
}
cout << -ans << endl;
}
return 0;
}