[LintCode]Copy Books

http://www.lintcode.com/en/problem/copy-books/

有n本书,每本pages[i]页,一个工人一分钟复制一页,一共k个工人,每个工人分到的书号必须连续,求怎样分最后一个工人结束时间最早



解析:

这个其实就是抽象成问题,一个数组分为k个子数组,保证最大子数组和最小


解法一:

二分查找,解一定位于[max, sum]之间。count可能返回的是res + 1,因为最后一个子数组没记录进去

public class Solution {
    public int copyBooks(int[] pages, int k) {
        // write your code here
        if (pages.length == 0) {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int sum = 0;
        for (int p : pages) {
        	max = Math.max(max, p);
        	sum += p;
        }
        while (max + 1 < sum) {
        	int mid = max + (sum - max) / 2;
        	if (count(pages, mid) <= k) {
        		sum = mid;
        	} else {
        		max = mid;
        	}
        }
        if (count(pages, max) <= k) {
        	return max;
        }
        return sum;
    }
    private int count(int[] pages, int limit) {
    	int sum = 0;
    	int res = 0;
    	for (int p : pages) {
    		if (sum + p > limit) {
    			sum = 0;
    			res++;
    		}
    		sum += p;
    	}
    	return sum == 0 ? res : res + 1;
    }
}


解法二:

DP,时间复杂度比较高,可查询网上

http://jane4532.blogspot.jp/2015/07/lintcode-copy-books.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值