题意:
n天,每天都需要一定的预算,这n天连续分成m组,求能满足每一组预算的最小值(m组中最大预算的最小值)
思路:
最大值最小化,二分,二分过程中判断当前每组预算(mid)能否将n天分成m组
1 #include<iostream> 2 3 using namespace std; 4 int cost[100005]; 5 int main() 6 { 7 int n,m; 8 int lef = 0,righ = 0; 9 cin>>n>>m; 10 for(int i = 1;i<=n;i++) 11 { 12 cin>>cost[i]; 13 righ += cost[i];//上界,只有一个fajomonth 14 if(lef<cost[i]) lef = cost[i];//下界,每一个月都是fajomonth 15 } 16 int mid = (lef+righ)/2; 17 while(lef<righ) 18 { 19 20 int sum = 0; 21 int cnt = 0; 22 for(int i = 1;i<=n;i++)//遍历一遍,看预算为mid,能有几个fajomonth 23 { 24 if(sum + cost[i]<=mid) 25 { 26 sum += cost[i]; 27 } 28 else//超过预算了,计算下一个fajomonth 29 { 30 sum = cost[i]; 31 cnt++; 32 } 33 } 34 if(cnt>=m) 35 { 36 lef = mid+1; 37 } 38 else righ = mid-1; 39 mid = (lef+righ)/2; 40 } 41 cout<<mid<<endl; 42 return 0; 43 }