http://poj.org/problem?id=3273
给你每天的花费,让你分成m组 要求各组的和中的最大值越小越好
二分查找
#include<iostream> using namespace std; const int N=100001; int n,m; bool toosmall(int k,int money[]) { int count=1;//k吧花费分成的组数,开始为一组 int sum=0; for(int i=1;i<=n;++i) { if(sum+money[i]>k)//如果超过k 应增加一组,所以count加一 sum更新重计 { sum=money[i]; ++count; } else { sum=sum+money[i]; } } if(count>m)//组数太多说明mid太小 return true; return false; } int main() { while(cin>>n>>m) { int money[N]; int high,low; high=0;//上界 low=0;//下界 for(int i=1;i<=n;++i) { cin>>money[i]; low=max(low,money[i]);//最大的那个为下界 high=high+money[i];//和为上界 } int mid=(high+low)/2; while(low<high) { if(toosmall(mid,money))//如果mid太小 { low=mid+1; } else//mid太大 或者正好 { high=mid; } mid=(high+low)/2; } cout<<mid<<endl; } return 0; }