题目描述
小Biu去逛超市,超市有一个长度为n的货架,第i个位置摆放着价值为a[i]的商品,小Biu有很多好朋友,他想给好朋友们买一些礼物,但是小Biu又是一个很细心地人,他想让所有朋友收到的礼物的总和一样,而且送给每个朋友的礼物必须是位置连续的一段商品,小Biu想知道他最多可以给多少个好朋友送出礼物。
输入
第一行两个整数n(1<=n<=1000)。
第二行n个整数,第i个整数为第i个数字a[i],(1<=a[i]<=20)。输出
输出一个数字表示答案。
样例输入 Copy
5 1 3 4 3 1样例输出 Copy
3提示
样例解释:[1,3] [4] [3,1] 可以分为三个不相交而且区间和相等的区间。
20%的数据中,1<=n<=10
50%的数据中,1<=n<=100
100%的数据中,1<=n<=1000
二分答案
代码
#include <iostream>
using namespace std;
int a[1005],sum[1005];
int n,i,mid,l,r;
bool check(int mid)
{
int cnt,i,j,k;
for(k=1;k<=sum[n]/mid;k++) //k为区间和的可能取值
{
cnt=0;
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
if(sum[j]-sum[i-1]==k) {cnt++;i=j+1;}
}
if(cnt>=mid) return true;
}
return false;
}
int main()
{
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];//前缀和数组
l=0;r=n+1;
while(l+1<r)
{
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
cout<<l;
}