书籍复印-LintCode

来源:互联网 发布:windows to go u盘价格 编辑:程序博客网 时间:2024/04/30 02:49

给出一个数组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
原创粉丝点击