题意:已知M天中每天的花费。将这些天恰好划分成N个周期,每个周期的花费定义为在该周期内每天的花费的和。现在想最小化最大的周期的花费。
思路:一般遇到这种最小化最大值的问题,可以先考虑一下二分答案是否可行。
对于这道题,我们就可以二分答案,按照最大的花费进行周期的划分,看是否满足题意。
自己在写二分的时候遇到了麻烦,应该还是手生了。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 100010;
int N,M;
int mon[MAX];
int judge(int limit)
{
int cnt = 0, len = 0;
for(int i = 0; i < N; ++i){
if(len + mon[i] <= limit)
len += mon[i];
else
cnt++,len = mon[i];
}
return cnt + 1;
}
int main(void)
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&N,&M) != EOF){
int maxb = 0, sum = 0;
for(int i = 0; i < N; ++i){
scanf("%d",&mon[i]);
maxb = max(maxb,mon[i]);
sum += mon[i];
}
int lb = maxb - 1, ub = sum;
while(lb + 1 < ub){
int mid = (lb + ub) >> 1;
if(judge(mid) > M)
lb = mid;
else
ub = mid;
//printf("%d %d\n",lb,ub);
}
printf("%d\n",ub);
}
return 0;
}