📖 Scenario: You are organizing a workshop and need to divide n identical items into k boxes. Each box must have the same number of items. You want to find the maximum number of items that can be placed in each box without leaving any box empty.
🎯 Goal: Build a program that uses the binary search on answer technique to find the maximum number of items per box that can be evenly distributed into k boxes.
📋 What You'll Learn
Create an integer variable n with value 100
Create an integer variable k with value 7
Create integer variables low and high for binary search range
Implement a binary search loop using low, high, and mid
Calculate how many boxes can be filled with mid items each
Adjust low and high based on the number of boxes filled
Print the maximum number of items per box found
💡 Why This Matters
🌍 Real World
This technique helps solve problems where you need to find the best possible value under constraints, like packing, scheduling, or resource allocation.
💼 Career
Binary search on answer is a common pattern in coding interviews and competitive programming, useful for optimizing solutions efficiently.
Progress0 / 4 steps
1
Setup the initial variables
Create two integer variables called n and k with values 100 and 7 respectively.
DSA C++
Hint
Use int n = 100; and int k = 7; to create the variables.
2
Initialize binary search range variables
Create two integer variables called low and high. Set low to 1 and high to n.
DSA C++
Hint
Set low to 1 because minimum items per box is 1, and high to n because maximum items per box cannot exceed total items.
3
Implement the binary search loop
Write a while loop that runs while low is less than or equal to high. Inside the loop, calculate mid as the average of low and high. Then calculate how many boxes can be filled with mid items each by dividing n by mid. If the number of boxes filled is at least k, set low to mid + 1. Otherwise, set high to mid - 1. Use integer division for calculations.
DSA C++
Hint
Use a binary search loop to narrow down the maximum items per box.
4
Print the maximum items per box
Print the value of high using std::cout to display the maximum number of items per box.
DSA C++
Hint
The final answer is stored in high after the loop ends.
Practice
(1/5)
1. What is the main idea behind the Binary Search on Answer technique?
easy
A. Searching for the answer by repeatedly dividing the search space based on feasibility
B. Sorting the array before applying binary search
C. Using binary search to find an element in a sorted array
D. Applying binary search only on arrays with unique elements
Solution
Step 1: Understand the problem context
Binary Search on Answer is used when the answer lies within a range and we can check feasibility for a candidate answer.
Step 2: Apply binary search on the answer range
We repeatedly pick a middle value and check if it satisfies the problem's conditions, narrowing the search space accordingly.
Final Answer:
Searching for the answer by repeatedly dividing the search space based on feasibility -> Option A
Quick Check:
Binary Search on Answer = feasibility check [OK]
Hint: Think of binary search on answer as guessing and checking [OK]
Common Mistakes:
Confusing it with normal binary search on arrays
Not checking feasibility properly
Trying to apply it on unsorted data without a valid range
2. Which of the following is the correct syntax to start a binary search on answer for an integer range low to high in C++?
easy
A. while (low <= high) { int mid = (low + high) / 2; }
B. for (int mid = low; mid <= high; mid++) { }
C. while (low < high) { int mid = low + (high - low) / 2; }
D. if (low < high) { mid = (low + high) / 2; }
Solution
Step 1: Identify the correct loop condition
Binary search typically uses a loop with condition low < high to avoid infinite loops and handle edge cases.
Step 2: Calculate mid safely
Using mid = low + (high - low) / 2 prevents integer overflow compared to (low + high) / 2.
Final Answer:
while (low < high) { int mid = low + (high - low) / 2; } -> Option C
Quick Check:
Safe mid calculation with proper loop [OK]
Hint: Use low + (high - low)/2 to avoid overflow [OK]
Common Mistakes:
Using <= in loop causing infinite loops
Calculating mid as (low + high)/2 risking overflow
Using for loop instead of while for binary search
3. Consider the following code snippet that uses binary search on answer to find the minimum maximum load for dividing an array into k subarrays:
bool canDivide(const vector<int>& arr, int k, int maxLoad) {
int currentSum = 0, count = 1;
for (int num : arr) {
if (num > maxLoad) return false;
if (currentSum + num > maxLoad) {
count++;
currentSum = num;
} else {
currentSum += num;
}
}
return count <= k;
}
int binarySearchAnswer(const vector<int>& arr, int k) {
int low = 0, high = 0;
for (int num : arr) high += num;
while (low < high) {
int mid = low + (high - low) / 2;
if (canDivide(arr, k, mid)) high = mid;
else low = mid + 1;
}
return low;
}
int main() {
vector<int> arr = {7, 2, 5, 10, 8};
int k = 2;
cout << binarySearchAnswer(arr, k) << endl;
}
What is the output of this program?
medium
A. 15
B. 18
C. 20
D. 22
Solution
Step 1: Understand the problem and code
The code finds the minimum maximum sum when dividing the array into 2 subarrays. The total sum is 7+2+5+10+8=32.
Step 2: Trace binary search on answer
Check mid values and feasibility: - mid=16: canDivide returns true (possible, e.g., subarrays sums 14 and 18) - mid=15: canDivide returns true (possible, e.g., subarrays sums 14 and 15) - mid=14: canDivide returns false (cannot split into 2 with max sum 14) Binary search narrows down to 15 as minimum max load.
Final Answer:
15 -> Option A
Quick Check:
Minimum max load = 15 [OK]
Hint: Sum array, binary search between 0 and sum [OK]
Common Mistakes:
Not checking if single element > mid
Incorrectly updating low and high
Misunderstanding feasibility function
4. The following code attempts to find the smallest maximum weight capacity to ship packages within D days using binary search on answer. Identify the bug:
bool canShip(const vector<int>& weights, int D, int capacity) {
int days = 1, currentLoad = 0;
for (int w : weights) {
if (w > capacity) return false;
if (currentLoad + w > capacity) {
days++;
currentLoad = w;
} else {
currentLoad += w;
}
}
return days <= D;
}
int shipWithinDays(const vector<int>& weights, int D) {
int low = 0, high = accumulate(weights.begin(), weights.end(), 0);
while (low <= high) {
int mid = low + (high - low) / 2;
if (canShip(weights, D, mid)) high = mid - 1;
else low = mid + 1;
}
return low;
}
medium
A. The loop condition should be low < high instead of low <= high
B. The mid calculation can cause integer overflow
C. The canShip function does not handle empty weights array
D. The initial value of low should be the maximum weight in the array, not 0
Solution
Step 1: Analyze initial search range
Low should start at the maximum single package weight because capacity cannot be less than the heaviest package.
Step 2: Identify impact of wrong low value
Starting low at 0 causes unnecessary checks and may cause incorrect results or longer runtime.
Final Answer:
The initial value of low should be the maximum weight in the array, not 0 -> Option D
Quick Check:
Low = max(weights) [OK]
Hint: Low must be max element, high sum of all [OK]
Common Mistakes:
Starting low at 0 instead of max element
Using <= in loop causing off-by-one errors
Ignoring edge cases with large weights
5. You want to find the minimum time required to complete n tasks using m machines, where each machine can complete one task in a fixed time given by array times. You can assign multiple tasks to a machine but tasks are done sequentially. Using binary search on answer, which approach correctly finds the minimum time to finish all tasks?
Choose the correct approach:
hard
A. Binary search on number of machines from 1 to m, checking if tasks can be done in fixed time
B. Binary search on time range from 0 to max(times) * n, and check if total tasks done by all machines in mid time is at least n
C. Sort times and pick the machine with minimum time multiplied by n
D. Use binary search on tasks from 1 to n, checking if tasks fit in given time
Solution
Step 1: Define search space for binary search
The minimum time is 0 and maximum time is max machine time * n tasks (worst case all tasks on slowest machine).
Step 2: Check feasibility at mid time
Calculate total tasks all machines can complete in mid time by summing floor(mid / times[i]). If total tasks >= n, mid time is feasible.
Step 3: Narrow search space
If feasible, try smaller time by setting high = mid; else low = mid + 1.
Final Answer:
Binary search on time range from 0 to max(times) * n, and check if total tasks done by all machines in mid time is at least n -> Option B
Quick Check:
Binary search on time with feasibility check [OK]
Hint: Search time range, count tasks done at mid [OK]
Common Mistakes:
Binary searching on machines instead of time
Not summing tasks correctly for feasibility
Ignoring sequential task processing per machine
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.