链接: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 }