二分搜索。-----------实验室的师兄给力啊! 题意:给N个数,划分为M堆(连续的)。求M堆中最大值的最小值。 事实说明要真正写好一个二分不是那么容易的! #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m; int date[100005]; void solve(int left,int right,int n) { int l=left,r=right,i; int sum,mon,mid; while(l<=r) { mon=1;sum=0; mid=(l+r)>>1; for(i=1;i<=n;i++) { if(sum+date[i]<mid) sum+=date[i]; else { sum=date[i]; mon++; } } if(mon>m) l=mid+1;// 整数在/2的时候可能造成精度不够,故可+1。 else r=mid-1; } printf("%d/n",mid); } int main() { int r=0,l=0,i; cin>>n>>m; for(i=1;i<=n;i++) { scanf("%d",&date[i]); if(date[i]>l )l=date[i]; r+=date[i]; } solve(l,r,n); return 0; }