D. Add to Neighbour and Remove

分析:
读题可知无论怎么改变数组,最后的和都不会边,同时因为n较小,因此可以枚举最后剩下的数组长度来解决。关于数字合并,因为枚举长度则可以知道最后的值,从左到右合并,如果出现合并的数字大于那后的值则不符合题意,如果出现一组合并的值能全部都等于最后的值这为答案,输出合并数据即可。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <map>
#include <math.h>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int maxn = 2 * 1e4 + 100;
const long long INF = 1e18;
int a[maxn];
int pre[maxn];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
cin >> n;
int sum = 0 ;
for (int i = 1; i <= n; i++)
cin >> a[i], sum += a[i], pre[i] = pre[i - 1] + a[i];
for (int i = n; i >= 1; i--) {
if (sum % i == 0) {
int each = sum / i;
int now = 0;
int cnt = 0;
int num = 0;
for (int i = 1; i <= n; i++) {
if (now != 0)
num++;
now += a[i];
if (now == each) {
now = 0 ;
cnt++;
} else if (now > each) {
cnt = -1;
break;
}
}
if (cnt == i) {
cout << num << endl;
break;
}
}
}
}
}

浙公网安备 33010602011771号