这题和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 ",mid); 45 } 46 return 0; 47 }