LINTCODE——书籍复印
思路:刚开始用回溯做的,结果果然超时了,然后想了好久,发现可以用二分法,把每个人所需复印的页数作为二分法的讨论点,然后如果当前页数(即mid)能够满足少于或等于k个人数来复印,则二分法的右值左移(即查找有没有更小的数能够满足),反之左值右移
class Solution {
private:
int res = INT_MAX;
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
int L = 0;
int R = 99999999;
while (L < R) {
//二分法,mid为每个人需复印的页数
int mid = (L + R) / 2;
if (check(mid, pages, k))
R = mid;
else
L = mid + 1;
}
return L;
}
bool check(int count, vector<int> &pages, int k)
{
//pelpnum为所需人数
int pelpnum = 0;
int sum = 0;
for(int i = 0 ; i < pages.size(); i++)
{
if( sum + pages[i] <= count)
sum += pages[i];
else if(pages[i] <= count)
{
//若sum+pages[i] > count,则如果满足当前条件,直接将sum置为pages[i]
pelpnum++;
sum = pages[i];
}
else
return false;
}
if(sum > 0)
pelpnum++;
return pelpnum <= k;
}
};