[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

發佈了363 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章