和 CF1462D 完全一样。
总之就是要合并成几个相同的数,那么这个数必然是 ∑ i = 1 n a i \sum_{i=1}^{n}a_i ∑i=1nai 的因数。
那么暴力 O ( n s u m ) O(n\sqrt{sum}) O(nsum)(令 s u m = ∑ i = 1 n a i sum=\sum_{i=1}^na_i sum=∑i=1nai)求 i i i 和 s u m i \frac{sum}{i} isum 是否可行,可行则取最小值。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[100005],sum,ans;
int main()
{
int t;
cin>>t;
while(t--)
{
sum=0;
ans=1e9;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
if(sum==0)//特判
{
cout<<0<<endl;
continue;
}
for(int i=1;i*i<=sum;i++)
{
if(sum%i) continue;//不是 sum 的因数
int x=i,f=1,t=0;
ll s=0;
for(int j=1;j<=n;j++)//对于 i 的暴力
{
s+=a[j];
if(s==x)
{
t++;
s=0;
}
else if(s>x)
{
f=0;
break;
}
}
if(f) ans=min(ans,n-t);
x=sum/i;
f=1;
t=s=0;
for(int j=1;j<=n;j++)//对于 sum/i 的暴力
{
s+=a[j];
if(s==x)
{
t++;
s=0;
}
else if(s>x)
{
f=0;
break;
}
}
if(f) ans=min(ans,n-t);
}
cout<<ans<<endl;
}
return 0;
}