其实就是一到和疯牛一样思路的题目。
每次分下了满足要求的每个组的最大值得最小值就是所以数中的最大值,最大值的最大值就是所有的数的和,此时是装在一个袋子里面的。
如果是枚举的也可以因为数据太水还是可以过的,但是可以用二分,但是每次二分返回的就是你要符合条件的值,还有要注意的是,while(left《=right)是和right=mid-1;
left=mid+1,而while(left<right)是和right=mid,left=mid+1;一起的的。不注意就出现死循环的。
#include <stdio.h>
#include <string.h>
int a[1005], n, m;
int find(int d)
{
int ans=1,cout=0;
for(int i =0; i<n; i++)
{
cout+=a[i];
if(cout>d)
{
ans++;
cout=a[i];
}
}
if(ans<=m)
return 1;
return 0;
}
void two(int left ,int right)
{
int wid;
while(left<=right)
{
wid=(left+right)/2;
if(find(wid))
right=wid-1;
else
left=wid+1;
}
printf("%d\n",left);//切记输出wid的时候不一定能满足left但是left能满足
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
int cout=0,max=-9;
for(int i =0; i<n; i++)
{
scanf("%d", &a[i]);
cout+=a[i];
if(max<a[i])
max=a[i];
}
two(max,cout);
}
return 0;
}