poj 3273 - Monthly Expense

这题和poj3258 类似,不同的是那个是最小值最大化,这个是最大值最小化,都是二分枚举去验证。验证最小值时是遇到比它小的就合并,验证最大值时是遇到就合并直到比它大。

 1 #include <cstdio>
 2 #define N 100005
 3 int m,n,s[N];
 4 bool ok(int x)
 5 {
 6     int cnt=1,f=0,i;
 7     for(i = 1; i <= n; i++)
 8     {
 9         if(s[i]-s[f] > x)
10         {
11             if(i-f == 1)
12                 return 0;
13             else{
14                 cnt++;
15                 f = --i;
16             }
17         }
18     }
19     if(cnt <= m)
20         return 1;
21     else return 0;
22 }
23 int main()
24 {
25     int i,t,max;
26     while(~scanf("%d%d",&n,&m))
27     {
28         s[0] = 0;
29         max = 0;
30         for(i = 1; i <= n; i++)
31         {
32             scanf("%d",&t);
33             s[i] = s[i-1]+t;
34             if(t > max) max = t;
35         }
36         int le=max,ri=s[n],mid;
37         while(le <= ri)
38         {
39             mid = (le+ri)/2;
40             if(ok(mid))
41                 ri = mid-1;
42             else le = mid+1;
43         }
44         printf("%d\n",mid);
45     }
46     return 0;
47 }

 

你可能感兴趣的:(poj 3273 - Monthly Expense)