#include <iostream>
#include<vector>
using namespace std;
/*建立数组vec[i],依次输入
用sum[i-1]代表前i项数之和;
positive[i-1]代表前i项中正数的个数;
先找第一部分,再凑第二部分,最后凑第三部分,使每部分的和=sum[n-1]/3。
依次遍历数组,当sum[i]==sum[n-1]/3且positive[i]>0时,
令j=i+1;当sum[j]==2*sum[n-1]/3且positive[j]-positive[i]>0时,
令k=j+1;当sum[k]==sum[n-1]且positive[k]-positive[j]>0时,count++;跳出内层循环
输出count;
*/
int main() {
int n;
while (cin >> n) {
vector<int>vec(n), sum(n), positive(n);
for (int i = 0; i < n; i++)cin >> vec[i];
//计算sum[i]和positive[i]
sum[0] = vec[0];
positive[0] = (vec[0] > 0 ? 1 : 0);
for (int i = 1; i < n; i++) {
sum[i] = sum[i - 1] + vec[i];
positive[i] = positive[i - 1] + (vec[i] > 0 ? 1 : 0);
}
//如果和不是3的倍数,直接输出0,返回
if (sum[n - 1] % 3 != 0) {
cout << '0';
return 0;
}
int part_sum = sum[n - 1] / 3;
int count = 0;
for (int i = 0; i < n - 2; i++) { //计算第一层
if (sum[i] == part_sum && positive[i] > 0) { //找到切割点
for (int j = i + 1; j < n - 1; j++) { //计算第二层
if (sum[j] == 2 * part_sum && positive[j] - positive[i] > 0) {
for (int k = j + 1; k < n; k++) { //计算第三层
if (sum[k] == 3 * part_sum && positive[k] - positive[j] > 0) {
count++;
break;
}
}
}
}
}
}
cout << count;
return 0;
}
}
为自己鼓掌

京公网安备 11010502036488号