题意
有 本书,由 个人来抄写,一本书只能由一个人来抄写,现求一种方案,使得每人分到的页数和的最大值最小。
样例
输入
9 3
100 200 300 400 500 600 700 800 900
输出
1700
思路
二分
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,p[3005];
bool check(int x)
{
int sum=0,time=0;//sum表示当前时间所需要的人数,time表示当前这个人用了多少时间
for (int i = 1; i <= n; ++i) {
if (p[i]>x) return 0;//如果这本书本来就超过了限制,那就不用再做了
if (time+p[i]>x) {//求当前人数是否足够
++sum;
time=0;
}
time+=p[i];
if (sum>m) return 0;//如果人数超出了限制,那也是错的
}
if (time!=0) sum++;//判断最后一个人
if (sum>m) return 0;
return 1;
}
int main()
{
int l=0,r;
scanf("%d%d",&n,&m);
for (int i = 1; i <= n; ++i) {
scanf("%d",&p[i]);
r+=p[i];//求出最大值
}
while (l<=r)
{
int mid=(l+r)/2;//取中间值
if (check(mid)) r=mid-1;
else l=mid+1;
}
printf("%d",l);
}