题目要求如何将月份分组就可以 使月份中的最大值最小
二分查找
上届:sum(a[i])
下届:max(a[i])
while(l<=r)
{
if(求的组别大于 题目要求)
l=mid+1;
else
r=mid-1;
....统计 (随时记录符合条件的月份中的最大值 的最小值)
}
注意 count<=m时就可以更新,count<m时一定可以分成m组
View Code
#include<stdio.h>
int a[100009];
int rmax;
int zu(int max,int n)//可以分成几组
{
int i;
int add=1,t=0;
rmax=0;
for(i=0;i<n;i++)
{
if((t+a[i])<=max)
{
t+=a[i];
}
else
{
add++;
t=a[i];
}
if(t>rmax)
rmax=t;
}
return add;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,all=0,max=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(max<a[i])
max=a[i];
all+=a[i];
}
int l=max,r=all,mid=(l+r)/2;
int count=zu(mid,n);
int min=999999999;
if(count<=m)
if(min>rmax)min=rmax;
while(l<=r)
{
if(count>m)
{
l=mid+1;
}
else
{
r=mid-1;
}
mid=(l+r)/2;
count=zu(mid,n);
if(count<=m)//分组小于要求时就可以更新
if(min>rmax)min=rmax;
}
printf("%d\n",min);
}
}