Allocate Minimum Pages Binary Search on Answer in DSA C++ - Time & Space Complexity
We want to find how fast the binary search approach works to allocate minimum pages among students.
How does the number of operations grow as the number of books or pages increases?
Analyze the time complexity of the following code snippet.
bool isPossible(int arr[], int n, int m, int mid) {
int studentCount = 1, pageSum = 0;
for (int i = 0; i < n; i++) {
if (pageSum + arr[i] <= mid) {
pageSum += arr[i];
} else {
studentCount++;
pageSum = arr[i];
if (studentCount > m || arr[i] > mid) return false;
}
}
return true;
}
int allocateMinimumPages(int arr[], int n, int m) {
int start = 0, end = 0, result = -1;
for (int i = 0; i < n; i++) end += arr[i];
while (start <= end) {
int mid = start + (end - start) / 2;
if (isPossible(arr, n, m, mid)) {
result = mid;
end = mid - 1;
} else {
start = mid + 1;
}
}
return result;
}
This code tries to find the minimum maximum pages a student can get by using binary search on the answer space.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The binary search loop runs repeatedly, and inside it, the
isPossiblefunction traverses the array once. - How many times: Binary search runs about log of the sum of pages times, and
isPossibleruns once per binary search step, traversing all books (n times).
As the number of books (n) or total pages increases, the binary search tries fewer guesses than checking all possibilities.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 * log(sum of pages) |
| 100 | About 100 * log(sum of pages) |
| 1000 | About 1000 * log(sum of pages) |
Pattern observation: Operations grow linearly with number of books and logarithmically with total pages.
Time Complexity: O(n * log(sum_of_pages))
This means the time grows linearly with the number of books and logarithmically with the total pages to allocate.
[X] Wrong: "The binary search runs in O(log n) time because it halves the input size each time."
[OK] Correct: The binary search here is on the range of possible page sums, not on the number of books. Each step requires checking all books, so the array traversal makes it O(n * log(sum_of_pages)).
Understanding this time complexity helps you explain how binary search can be applied beyond sorted arrays, showing problem-solving flexibility.
"What if we used a linear search instead of binary search on the answer range? How would the time complexity change?"
Practice
Allocate Minimum Pages problem using binary search on the answer?Solution
Step 1: Understand the problem objective
The problem wants to divide book pages among students so that the student with the most pages has as few pages as possible.Step 2: Recognize the use of binary search on answer
We use binary search on the range of possible maximum pages to find the minimum feasible maximum.Final Answer:
To minimize the maximum number of pages assigned to a student -> Option DQuick Check:
Goal = minimize max pages per student [OK]
- Thinking it maximizes total pages
- Confusing average with maximum
- Ignoring the binary search approach
Allocate Minimum Pages problem in C++?Solution
Step 1: Determine the minimum and maximum boundaries
The minimum possible max pages is the largest single book (no student can get less than that), and the maximum is the sum of all pages (one student gets all books).Step 2: Set binary search boundaries accordingly
So, low = max pages in a single book, high = sum of all pages.Final Answer:
int low = max pages in a single book, high = sum of all pages; -> Option AQuick Check:
low = max single book, high = total pages [OK]
- Setting low to 0 which is invalid
- Swapping low and high values
- Using average pages as boundary
Allocate Minimum Pages problem?int pages[] = {10, 20, 30, 40};
int n = 4, students = 2;
// Function to check feasibility
bool isPossible(int mid) {
int studentCount = 1, pageSum = 0;
for (int i = 0; i < n; i++) {
if (pages[i] > mid) return false;
if (pageSum + pages[i] > mid) {
studentCount++;
pageSum = pages[i];
if (studentCount > students) return false;
} else {
pageSum += pages[i];
}
}
return true;
}
int low = 40, high = 100, result = high;
while (low <= high) {
int mid = (low + high) / 2;
if (isPossible(mid)) {
result = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
std::cout << result << std::endl;Solution
Step 1: Understand the feasibility check
The function checks if pages can be allocated so no student gets more than mid pages.Step 2: Binary search to find minimum max pages
Try mid values between 40 and 100. The minimum feasible max pages is 60 (assign {10,20,30} to student 1 and {40} to student 2).Final Answer:
60 -> Option CQuick Check:
Minimum max pages = 60 [OK]
- Not updating student count correctly
- Choosing mid incorrectly
- Ignoring single book page size
Allocate Minimum Pages problem:bool isPossible(int mid, int pages[], int n, int students) {
int studentCount = 1, pageSum = 0;
for (int i = 0; i < n; i++) {
if (pageSum + pages[i] <= mid) {
pageSum += pages[i];
} else {
studentCount++;
pageSum = pages[i];
}
}
return studentCount <= students;
}Solution
Step 1: Analyze the feasibility function
The function tries to allocate books without exceeding mid pages per student.Step 2: Identify missing validation
It does not check if any single book has pages more than mid, which makes allocation impossible.Final Answer:
Missing check if a single book has pages more than mid -> Option AQuick Check:
Check single book pages <= mid [OK]
- Ignoring single book size check
- Resetting pageSum incorrectly
- Wrong loop start index
{12, 34, 67, 90} and 2 students, what is the minimum maximum number of pages a student can get when using binary search on answer to allocate books optimally?Solution
Step 1: Set binary search boundaries
Low = max single book = 90, High = sum = 12+34+67+90=203.Step 2: Use binary search to find minimum max pages
Check mid values. The minimum feasible max pages is 113 (assign {12,34,67}=113 to one student and {90} to the other).Final Answer:
113 -> Option BQuick Check:
Minimum max pages = 113 [OK]
- Choosing max single book as answer
- Choosing sum of pages as answer
- Not testing feasibility properly
Ready to prove it?
Pass the test and this pattern moves unknown
