将给出的那天的花费进行不间断划分,划为m组,且使得每组的花费最大值最小,此题可以采用二分,通过每次搜寻得出最终答案,二分上下界确定:单天花费最大值必定为下界,而所有天数的花费之和肯定为其上界,每次二分都进行一遍检查,通过检查判断来缩小二分范围,最终得出解答。
#include<cstdio>
#include<cstdlib>
#define max(a,b)(a>b?a:b)
using namespace std;
int n,m;
bool check(int*s,int num){
int sum=0,t=0;//统计组数
for(int i=0;i<n;i++){
if(sum+s[i]<=num)
sum+=s[i];
else{
t++;
sum=s[i];
}
}
t++;
if(t>m)return false;//不满足分组要求
return true;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
int* s=new int[n+5];//采用动态声请合理使用内存空间
int left=0, right=0;//二分上下界
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
left=max(left,s[i]);
right+=s[i];
}
int mid=(left+right)/2;
while(left<right){
if(check(s,mid))
right=mid;
else
left=mid+1;
mid=(right+left)/2;
}
printf("%d\n",mid);
}
}