题意:
传送门
给
n
个数 ,把n
个数分为m
组,求能分m
组,使m
组中每组的值尽量的小,求尽量小中的组的最大值
思路:
二分枚举答案,当每组的和刚好要大于
mid
时,可以分为1
组,然后求组数和真正要分的组数进行对比即可
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int n,m;
bool check(int mid)
{
int sum=0,k=1;
for(int i=1; i<=n; i++)
{
if(sum+a[i]<=mid)
{
sum+=a[i];
}
else
{
sum=a[i];
k++;
}
//sum+=a[i];
}
if(k>m)
return false;//组多了
return true;
}
int main()
{
scanf("%d %d",&n,&m);
int l=0,r=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
r+=a[i];
l=max(l,a[i]);
}
//printf("%d %d\n",l,r);
int ans;
while(r>=l)
{
int mid=l+r>>1;
if(check(mid))
{
r=mid-1;
ans=mid;
}
else
{
l=mid+1;
}
}
printf("%d\n",ans);
}
注意:有些二分只能单方向二分,不能反向二分不然会出问题