1405B - Array Cancellation

题目链接:1405B - Array Cancellation

 

题目大意:

给一列数组,数组元素和为0,每次操作找两个不同下标i,j,如果让a[i]减一,a[j]加一,如果i小于j则该操作免费,否则,该操作需消耗一块钱,问最少消耗多少钱可以使所有元素都为零。

 

思路:

为了消耗最少,肯定是先进行免费操作,剩下的必须进行付费操作的再进行付费操作,可以遍历一遍数组,将元素累加,如果累加和变为负数了,把他变为0,因为在他之后一定会有一个等于负数相反数的正数。

 

参考代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main() {
 5     ll s,n,a,t;
 6     cin >> t;
 7     while(t--) {
 8         cin >> n; s = 0;
 9         for(ll i = 1; i <= n; i++) {
10             cin >> a;
11             s = max(0LL,s+a);
12         }
13         cout << s << endl;
14     }
15     return 0;
16 }
View Code

 

posted @ 2020-12-22 22:15  不敢说的梦  阅读(70)  评论(0)    收藏  举报