0
点赞
收藏
分享

微信扫一扫

【洛谷主题库】P8183 [USACO22FEB] Sleeping in Class B

互联网码农 2022-04-05 阅读 29
c++

和 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;
}
举报

相关推荐

0 条评论