考虑暴力枚举。
枚举第一段的长度,如果把第一段的和做为每段的和可行,就更新答案。
代码如下(思路都在代码里):
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int t, n, as;
ll a[2001], k; //k表示a数组中前i个数的和,即枚举到的每段的和
int main()
{
cin >> t;
while (t--)
{
k = 0;
as = INF; //多组数据初始化
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
{
k += a[i];
ll sm = 0; //sm(sum)表示当前段的累加和
int ct = 0, mx = i; //ct(count)为当前段的长度;mx(max)为每段的最大长度,开始时为i
for (int j = i + 1; j <= n; j++)
{
sm += a[j];
ct++;
if (sm > k) //若以k为每段和不行就退出
{
mx = -1;
break;
}
if (sm == k) //若可以,更新以k为每段和时每段长度的最大值
{
mx = max(mx, ct);
ct = 0;
sm = 0;
}
}
if (!((sm && sm < k) || mx == -1)) //特判最后一段及以k为每段和不行的情况,统计答案
as = min(as, mx);
}
cout << as << '\n';
}
return 0;
}