poj 3273 Monthly Expense

给出一组数据,最大值为left,和为right。在[left,right]区间进行二分!!!

代码:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define pi acos(-1.0)
10 #define MAX 50000
11 using namespace std;
12 int an[100005];
13 int main(){
14     int n,m,i,sum,left,right=0,mid,t;
15     while(cin>>n>>m){
16         for (i=0;i<n;i++){
17             cin>>an[i];
18             if(i){
19                 if(left<an[i]) left = an[i];
20             }else{
21                 left = an[i];
22             }
23             right += an[i];
24         }
25         while (left<right){
26             mid = (left+right)/2;
27             sum = 0;t = 0;
28             for (i=0;i<n;i++){
29                 if (sum+an[i]>mid){//如果大于mid则区间短+1
30                     sum = an[i];
31                     t++;
32                 }
33                 else {
34                     sum += an[i];
35                 }
36             }
37             if (t<m){//t<m,说明m取大了
38                 right = mid;
39             }
40             else{
41                 left = mid+1;
42             }
43         }
44         cout<<right<<endl;
45     }
46     return 0;
47 }
View Code

 

 

 

posted @ 2013-07-30 09:48  _随心所欲_  阅读(173)  评论(0编辑  收藏  举报