继续二分搜索 这次是求最大值的最小 #include<iostream> using namespace std; #define N 505 int a[N]; int res[N]; int bin_search(int l,int r,int n,int m) { int left=l,right=r,mid,cnt,sum; while(left<=right) { mid=(left+right)/2; sum=0;cnt=1; for(int i=1;i<=n;i++) { if(sum+a[i]>mid) { cnt++; sum=a[i]; } else sum+=a[i]; } if(cnt<=m) right=mid-1; else left=mid+1; } return left; } int main() { int ca,n,m,i,l,r,sum,maxn,k,j; scanf("%d",&ca); while(ca--) { l=0,r=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",a+i); if(a[i]>l) l=a[i]; r+=a[i]; } maxn=bin_search(l,r,n,m); sum=0; k=0; for(i=n;i>=1;i--) { if(m==1) break; if(i==m-1) { res[k++]=i; m--; continue; } if(sum+a[i]>maxn) { m--; sum=a[i]; res[k++]=i; } else sum+=a[i]; } res[k]=0; for(i=k-1;i>=0;i--) { for(j=res[i+1]+1;j<=res[i];j++) printf("%d ",a[j]); printf("/ "); } for(j=res[0]+1;j<=n;j++) { printf("%d",a[j]); if(j!=n) printf(" "); } printf("/n"); } }