【JZOJ】【二分】抄书

题意

n n 本书,由 m m 个人来抄写,一本书只能由一个人来抄写,现求一种方案,使得每人分到的页数和的最大值最小。

样例

输入

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);
} 

猜你喜欢

转载自blog.csdn.net/LTH060226/article/details/86663330
今日推荐