您的位置:首页 > 其它

POJ 3273 二分

2013-01-05 21:53 267 查看
/*

题意: 给你天数N(1 ≤ N ≤ 100,000),和每天需要花的钱(存放在数组中),
让你把这些天分成M(1 ≤ M ≤ N)份(每份都是连续的天),
要求每份的和最大值尽量小,输出这个和。
分析:二分,用最大money[]为左端点,money[]总和为右端点...要求的结果一定
在该范围内.. 所以要求mid的最优值
时间复杂度为:n*lg(n)...

*/
#include<iostream>
#include<algorithm>
#define manx 100009
using namespace std;
int n,m;  /// 天数,人数
int money[manx];  ///
bool judge(int mid){ /// 判断 mid 值是否符合条件
int sum=0,ans=1;
for(int i=1;i<=n;i++){
if(sum+money[i]<=mid)
sum+=money[i];
else { sum=money[i]; ans++; }
}
//   cout<<ans<<endl;
if(ans>m) return false;
else return true;
}
int main(){
while(cin>>n>>m){
int right=0,left=0;
for(int i=1;i<=n;i++){
scanf("%d",&money[i]);
if(money[i]>left)
left=money[i];
right += money[i];
}
int mid=(left+right)>>1;
while(left<right){
//        cout<<left<<" "<<mid<<" "<<right<<" ";
if(!judge(mid))
left=mid+1;  /// mid 偏小
else
right=mid-1;  /// mid 偏大
mid=(left+right)>>1;
//       system("pause");
}
cout<<mid<<endl;
}
}
/*

7 4
100
400
300
100
500
101
400

*/


 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: