给出一个数组A包含n个元素,表示n本书以及各自的页数。现在有个k个人复印书籍,每个人只能复印连续一段编号的书,比如A[1],A[2]由第一个人复印,但是不能A[1],A[3]由第一个人复印,求最少需要的时间复印所有书。
样例:
A = [3,2,4],k = 2
#ifndef C437_H
#define C437_H
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
/*
* @param pages: an array of integers
* @param k: An integer
* @return: an integer
*/
int copyBooks(vector<int> &pages, int k) {
// write your code here
if (pages.empty() || k <= 0)
return 0;
int len = pages.size();
int min = 0;
int max = 0;
for (auto c : pages)
{
if (c > min)
min = c;
max += c;
}
while (min < max)
{
int mid = (min + max) / 2;
if (isValid(pages, mid, k))
max = mid;
else
min = mid + 1;
}
return min;
}
bool isValid(vector<int> &pages, int mid, int k)
{
int num = 0;
int sum = 0;
int i = 0;
int len = pages.size();
while (i < len)
{
if (sum + pages[i] <= mid)
sum += pages[i++];
else if (pages[i] <= mid)
{
num++;
sum = 0;
}
else
return false;
}
if (sum != 0)
num++;
return num <= k;
}
};
#endif