题目链接:LightOJ-1048
题目大意:n+1个数,分成k+1段,使每个区间和的最大值尽可能的小
题目思路:二分答案从0~sum去求一个最优的结果,然后输出路径,输出路径时候要小心了,给一组样例自己体会,过了这个样例才过,,,4 2 111 1 2 3 44
#include<bits/stdc++.h>
using namespace std;
int n,k,b[1005];
int solve(int l,int r,int *a)
{
int mid,c,ans;
while(l<=r){
mid=(l+r)/2;c=0;
int temp=0;
for(int i=0;i<n;i++){
if(a[i]>mid) { c=k+1; break; }
if(temp+a[i]>mid){
temp=a[i];
c++;
}
else temp+=a[i];
}
if(c<k) r=mid-1,ans=mid;
else l=mid+1;
}
return ans;
}
int main()
{
int t,cas=0;
cin>>t;
while(t--){
int sum=0,a[1005],c=0;
scanf("%d%d",&n,&k);
n++;k++;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int ans=solve(0,sum,a);
printf("Case %d: %d\n",++cas,ans);
int temp=0;
for(int i=0;i<n;i++){
if(temp+a[i]>ans||k-c>n-i){
printf("%d\n",temp);
temp=a[i];
c++;
}
else temp+=a[i];
}
printf("%d\n",temp);
}
return 0;
}