zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    屏幕取色器colorspy
    js监控按键
    修改硬件信息小工具
    C#SendKeys的用法
    错误分析:程序集未标记为可序列化
    C#xml反序列化
    office2010激活工具
    截图软件
    C#画图
    .net中SQL防注入代码
  • 原文地址:https://www.cnblogs.com/hh13579/p/15671728.html
Copyright © 2011-2022 走看看