POJ3273 Monthly Expense (二分最小化花费)

链接:http://poj.org/problem?id=3273

题意:FJ想把n天分成m组,每组是连续的,同一组的花费加起来算,求所分组情况中最高花费的最低值

思路:二分答案。二分整数范围内的花费,每次去check一下,check的过程贪心处理即可。

AC代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 int N,M;
 8 vector<int> day;
 9 bool check(int x){
10     int cnt = 1;//cnt记录组数 
11     int cost = 0;//cost记录一组的花费 
12     for(int i = 0;i<day.size() ;i++){
13         if(day[i]>x){
14             return false;//如果某一天的花费大于x,直接返回false 
15         }
16         if(cost+day[i]>x){//如果花费超过x,那么就加一组 
17             cnt++;
18             cost = day[i];
19             continue;
20         }
21         cost+=day[i];
22     }
23     return cnt<=M;
24 }
25 int main(){
26     while(cin>>N>>M){
27         day.clear() ;
28         for(int i = 0;i<N;i++){
29             int t;cin>>t;
30             day.push_back(t); 
31         }
32         int l = 0,r = 1e9+10;
33         int mid; 
34         while(l<r){
35             mid = (l+r)>>1;
36             if(check(mid)){
37                 r = mid ;
38             }
39             else{
40                 l = mid + 1;
41             }
42         }
43         cout<<l<<endl;
44     }
45     return 0;
46 } 
posted @ 2020-01-09 01:54  AaronChang  阅读(187)  评论(0)    收藏  举报