POJ3273-Monthly Expense

题意:

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 }

猜你喜欢

转载自www.cnblogs.com/IceeeE/p/10573783.html