#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; } }
为自己鼓掌