题目描述:
n天分为m组,要求这m组尽可能每组钱数之和都很小,求所有分组方式里钱数之和最大的钱数。
题目类别:
二分法应用。通过指定最大钱数之和判断组数是否符合要求,如果不符合,根据条件对low 和 high 进行赋值。
源代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int n; //天数
int m; //组数
bool Judge(int mid,int money[]) //判断当前组数是多还是少
{
int i;
int sum=0;
int count=1;
for(i=1;i<=n;i++)
{
if(sum+money[i]<=mid) //钱数之和小于mid的可以算是一组内的
{
sum=sum+money[i];
}
else
{
sum=money[i]; //钱数之和大于mid要分两组
count++;
}
}
if(count>m)
return false; //组分多了,说明mid 较小
else
return true;
}
int main()
{
int i;
int low,high,mid;
while(scanf("%d%d",&n,&m)!=EOF)
{
high=0;
low=0;
int *money=new int [n+1];
for(i=1;i<=n;i++)
{
scanf("%d",&money[i]);
high=high+money[i]; //上限是只分一组,即所有的数之和
if(money[i]>low)
low=money[i]; //下限是分为n组,每天一组,取最大的
}
mid=(low+high)/2;
while(low<high)
{
if(Judge(mid,money)==false) //mid值较小
low=mid+1;
else
high=mid-1;
mid=(high+low)/2;
}
cout<<mid<<endl;
delete money;
}
return 0;
}此题是二分法的另一种应用,以后类似题目皆可采用。
二分法应用解决分组问题
本文介绍了一种利用二分法解决分组问题的方法,目标是在n天内将任务分为m组,使得每组任务量尽可能均衡,求解分组方式中任务量最大的值。通过设定最大任务量mid,判断组数是否符合要求,进而优化分组策略。
405

被折叠的 条评论
为什么被折叠?



