【JZOJ】【二分】抄書

題意

nn本書,由mm個人來抄寫,一本書只能由一個人來抄寫,現求一種方案,使得每人分到的頁數和的最大值最小。

樣例

輸入

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);
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章