lintcode 437书籍复印

给定n本书,第i本书有[i]页。有k个人来抄这些书。

这些书排成一行,每个人都可以索取连续一段的书。例如,一个复印机可以连续地将书从第i册复制到第j册,但是他不能复制第1册、第2册和第4册(没有第3册)。

他们在同一时间开始抄书,每抄一页书都要花1分钟。为了让最慢的复印机能在最早的时间完成书的分配,最好的策略是什么?

请返回最慢复印机花费的最短时间。

class Solution {
public:
    /**
     * @param pages: an array of integers
     * @param k: An integer
     * @return: an integer
     */
    //花x分钟,得用多少个人才能复印完
    int check(vector<int> &pages, int x) {
        int num = 1, y = x;
        for (int i = 0; i < pages.size(); ++i) {
            if (y >= pages[i]) {
                y -= pages[i];
            }
            else {
                y = x;
                y -= pages[i];
                num++;
            }
        }
        return num;
    }
    int copyBooks(vector<int> &pages, int k) {
        // write your code here
        int l = 0;
        long long r = 3e9;
        for (int i = 0; i < pages.size(); ++i) {
            l = max(l, pages[i]);
        }

        //在单调递增的序列中找到第一个大于等于k的数
        while (l + 1 < r) {
            int mid = (l + r ) / 2;
            //需要的人数大于k,mid太小了
            //需要找到第一个小于等于k的
            int x = check(pages, mid);
            if (x > k) {
                l = mid;
            }
            else if (x <= k){
                r = mid;
            }
        }
        if (check(pages,l) <= k) {
            return l;
        }
        return r;
    }
};
posted @ 2021-12-10 14:36  hh13579  阅读(57)  评论(0编辑  收藏  举报