題意
有本書,由個人來抄寫,一本書只能由一個人來抄寫,現求一種方案,使得每人分到的頁數和的最大值最小。
樣例
輸入
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);
}