一道不错的二分,思路很重要。 枚举可能的money值,然后判断分段的段数,跟给定值进行比较,接着不断逼近即可 #include<iostream> using namespace std; int n,m; int num[100010]; int main() { int left,right,mid; int i,sum=0; int cnt,temp,maxn=-1; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&num[i]); sum=sum+num[i]; if(num[i]>maxn) maxn=num[i]; } left=maxn; right=sum; while(left<right) { mid=(left+right)>>1; temp=0; cnt=0; for(i=1;i<=n;i++) { if(temp+num[i]>mid) { cnt++; temp=num[i]; } else temp=temp+num[i]; } cnt++; if(cnt<=m) right=mid; else left=mid+1; } printf("%d/n",right); return 0; }