Allocate Books
Given an array of integers A of size N and an integer B.
College library has N bags,the ith book has A[i] number of pages.
You have to allocate books to B number of students so that maximum number of pages alloted to a student is minimum.
A book will be allocated to exactly one student.
Each student has to be allocated at least one book.
Allotment should be in contiguous order, for example: A student cannot be allocated book 1 and book 3, skipping book 2.Calculate and return that minimum possible number.
NOTE: Return -1 if a valid assignment is not possible.
Input Format
The first argument given is the integer array A.
The second argument given is the integer B.Output Format
Return that minimum possible numberConstraints
1 <= N <= 10^5
1 <= A[i] <= 10^5For Example
Input 1:
    A = [12, 34, 67, 90]
    B = 2
Output 1:
    113
Explanation 1:
    There are 2 number of students. Books can be distributed in following fashion : 
        1) [12] and [34, 67, 90]
        Max number of pages is allocated to student 2 with 34 + 67 + 90 = 191 pages
        2) [12, 34] and [67, 90]
        Max number of pages is allocated to student 2 with 67 + 90 = 157 pages 
        3) [12, 34, 67] and [90]
        Max number of pages is allocated to student 1 with 12 + 34 + 67 = 113 pages
        Of the 3 cases, Option 3 has the minimum pages = 113.
Input 2:
    A = [5, 17, 100, 11]
    B = 4
Output 2:
    100public class Solution {
    public int helper(int[] A, int pagesAllowed) {
        int temp = 0;
        int students = 1;
        for (int i : A) {
            temp += i;
            if (temp > pagesAllowed) {
                students++;
                temp = i;
            }
        }
        return students;
    }
    public int books(int[] A, int B) {
        if (B > A.length)
            return -1;
        int lowerBound = Integer.MIN_VALUE;
        int upperBound = 0;
        for (int i : A) {
            lowerBound = Math.max(i, lowerBound);
            upperBound += i;
        }
        while (lowerBound <= upperBound) {
            int mid = (lowerBound + upperBound) / 2;
            int students = helper(A, mid);
            if (students == B) {
                upperBound = mid - 1;
            } else if (students < B) {
                upperBound = mid - 1;
            } else {
                lowerBound = mid + 1;
            }
        }
        return lowerBound;
    }
}
Last updated