核心
找到一个数x,使得满足划分成的子序列的和每一个都满足小于等于x,之后用二分法,不断使x与题目要求的最大值接近,从而求出答案
代码
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
vector<int> v;
int k;//k来存放所划分成几个序列
bool judge(int x) {
int i = 0;
int sum = 0;
int num = 1;
for (; i < v.size(); i++) {
if (v[i] > x) {//如果有一个数直接大于x就直接弹出
return false;
}
else
{
if (sum + v[i] <= x)
sum += v[i];
else
{
sum = v[i];
num++;
}
}
}
if (num <= k)//如果最后划分成的数列大于k就证明x太小
return true;
else
{
return false;
}
}
int trys(int begin, int end) {//用二分法去确定x的大小
if (begin == end-1)//因为begin肯定不行,end肯定行,最后begin和end相邻的时候end就是要求的值啦
return end;
int m = begin + (end - begin) / 2;
if (judge(m))
trys(begin, m);
else
{
trys(m, end);
}
}
int main(void) {
int n;
cin >> n;
cin >> k;
while (n--) {
int m;
cin >> m;
v.push_back(m);
}
int m = trys(0, 100);//传入0,100保证0肯定不行,100肯定行,100根据具体的情况变化
cout << m;
system("pause");
}