简单的二分答案,但要注意边界的选取以及如何二分答案
#includeusing namespace std;const int maxn=1e6+7;int n,m;int a[maxn];int sum[maxn];bool check(int x)//判断当前的答案{ int cnt=0; int tot=0; for(int i=1;i<=n;i++) { if(tot+a[i]<=x) { tot+=a[i]; } else { tot=a[i]; cnt++; } } return cnt>=m; }int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); l=max(l,a[i]);//左边界是数列中最大的数 r+=a[i];//右边界是数列中所有数字的和 } while(l<=r)//二分模板(因题而异,不过与zbh上课讲的不太一样) { int mid=(l+r)>>1; if(check(mid)) l=mid+1; else r=mid-1; } printf("%d",l);//答案是最大的最小,所以在左边界 return 0;}