//最大值最小 //天数的a[i]值是固定的 不能改变顺序 # include <algorithm> # include <string.h> # include <stdio.h> using namespace std; int n,m; int a[100010]; int judge(int x) { int ans=1;//分成了几组 int tmp=0; for(int i=0;i<n;i++) { tmp+=a[i]; if(tmp>x) { tmp=a[i]; //前i-1天小于等于m,把前i-1天作为一组,第i天作为下一组的第一天 ans++; } } if(ans>m)//大于m组,mid太小 return false; return true; } int main() { int i,sum,low; while(~scanf("%d%d",&n,&m)) { sum=0; low=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; if(low<a[i]) low=a[i]; } int l=low;//最小边界为单个里最大的 int r=sum; int mid; while(l<=r) { mid=(l+r)/2; if(judge(mid)) r=mid-1; else l=mid+1; } printf("%d ",l); } return 0; }