To Minimize The Maximum

Prolem:
     把一个包含n个正整数的序列划分成m个连续的子序列(每个正整数恰好属于一个序列)。设第i个序列的各数之和为S(i),如何让所有S(i)的最大值尽量小? 
例如序列1 2 3 2 5 4,划分成3个序列的最优方案为1 2 3 | 2 5 | 4,其中S(1)=6, S(2)=7, S(3)=4,最大值为7;如果划分成1 2 | 3 2 | 5 4,则最大值为9,不如刚才的好。
n≤10 6,所有数之和不超过10 9
Answer:
    /*
 * main.cpp
 *
 *  Created on: 2014年11月17日
 *      Author: CYT
 */
#include<iostream>

using namespace std;

const int maxn = 1000000;
int A[maxn], n, m, tmax = 0;
bool is_part(int x) {
int cross_bar = 0, s = 0;
bool ok = true;
for (int i = 0; i < n; i++) {
if (A[i] > x) {
ok = false;
break;
}
else if (s + A[i] > x){
cross_bar++;
s = A[i];
if (cross_bar > m - 1) {
ok = false;
break;
}
}
else {
s += A[i];
}
}
return ok;
}

int sum() {
int s = 0;
for (int i = 0; i < n; i++)
s += A[i];
return s;
}


int binary_solve() {
int x = tmax, y = sum();
while (x < y) {
int mid = (y + x) / 2;
if (is_part(mid))
y = mid;
else
x = mid + 1;
}
return x;
}


int main() {
while (cin >> n) {
cin >> m;
for (int i = 0; i < n; i++)
cin >> A[i];


int ans = binary_solve();
cout << ans << endl;
}
return 0;
}



你可能感兴趣的:(To Minimize The Maximum)