📖 Scenario: Imagine you are organizing a party and want to divide candies equally among children. You have a list of candy packs with different counts. You want to find the maximum number of candies each child can get so that all children get the same amount and no candy pack is split.
🎯 Goal: Build a program that uses the binary search on answer technique to find the maximum candies per child that can be distributed equally from given candy packs.
📋 What You'll Learn
Create a list called candy_packs with exact values: [10, 15, 20, 17]
Create a variable called children and set it to 7
Write a function called can_distribute that takes candies and returns True if candies can be given to all children equally, else False
Use binary search on the answer range to find the maximum candies per child
Print the final maximum candies per child
💡 Why This Matters
🌍 Real World
This technique helps solve problems where you guess an answer and check if it fits conditions, like dividing resources fairly or optimizing capacity.
💼 Career
Binary search on answer is a common pattern in coding interviews and real-world software tasks involving optimization and decision making.
Progress0 / 4 steps
1
Create the candy packs list
Create a list called candy_packs with these exact values: [10, 15, 20, 17]
DSA Python
Hint
Use square brackets and commas to create the list exactly as shown.
2
Set the number of children
Create a variable called children and set it to 7
DSA Python
Hint
Use the assignment operator = to set the value.
3
Write the can_distribute function
Write a function called can_distribute that takes a parameter candies and returns True if the sum of (pack // candies for each pack in candy_packs) is at least children, otherwise returns False
DSA Python
Hint
Use integer division // to count how many children can get candies from each pack.
4
Find and print the maximum candies per child
Use binary search between 1 and max(candy_packs) to find the maximum candies per child that can be distributed equally. Print the final maximum candies per child using print(max_candies)
DSA Python
Hint
Use a while loop with low and high pointers and update max_candies when can_distribute(mid) is True.
Practice
(1/5)
1. What is the main idea behind the Binary Search on Answer technique?
easy
A. We apply binary search to split the input into two equal halves repeatedly.
B. We sort the input array and then apply binary search to find an element.
C. We guess an answer and check if it satisfies the problem, then adjust the guess using binary search.
D. We use binary search to find the middle element of a sorted list.
Solution
Step 1: Understand the technique's purpose
Binary Search on Answer guesses a possible answer and checks if it meets the problem's conditions.
Step 2: Adjust guess based on check
If the guess is valid, we try smaller or larger guesses using binary search to find the optimal answer.
Final Answer:
We guess an answer and check if it satisfies the problem, then adjust the guess using binary search. -> Option C
Quick Check:
Guess and check with binary search = We guess an answer and check if it satisfies the problem, then adjust the guess using binary search. [OK]
Hint: Think of guessing answers and narrowing down with binary search [OK]
Common Mistakes:
Confusing with normal binary search on sorted arrays
Thinking it only finds elements, not answers
Ignoring the check step after guessing
2. Which of the following is the correct syntax to start a binary search on answer in Python for an integer answer between low and high?
easy
A. while low <= high:
mid = (low + high) // 2
B. for mid in range(low, high):
C. if low < high:
mid = (low + high) / 2
D. while low < high:
mid = (low + high) // 2 + 1
Solution
Step 1: Identify the binary search loop condition
Binary search typically uses a while loop with condition low <= high to cover all possible values.
Step 2: Calculate mid correctly
Mid is calculated as integer division (low + high) // 2 to get the middle integer index or value.
Final Answer:
while low <= high:
mid = (low + high) // 2 -> Option A
Quick Check:
Correct loop and mid calculation = while low <= high:
mid = (low + high) // 2 [OK]
Hint: Use while low <= high and integer division for mid [OK]
Common Mistakes:
Using for loop instead of while
Using float division instead of integer division
Wrong loop condition like low < high
3. Consider the following code snippet using binary search on answer to find the minimum maximum load for splitting an array into m subarrays:
def can_split(nums, m, max_load):
count, current_sum = 1, 0
for num in nums:
if current_sum + num > max_load:
count += 1
current_sum = num
if count > m:
return False
else:
current_sum += num
return True
nums = [7, 2, 5, 10, 8]
m = 2
low, high = max(nums), sum(nums)
while low < high:
mid = (low + high) // 2
if can_split(nums, m, mid):
high = mid
else:
low = mid + 1
print(low)
What is the output of this code?
medium
A. 15
B. 18
C. 20
D. 10
Solution
Step 1: Understand the problem and initial bounds
We want to split nums into 2 subarrays minimizing the maximum sum. low = max(nums) = 10, high = sum(nums) = 32.
Hint: Check mid as max load and validate splits [OK]
Common Mistakes:
Not setting low as max element
Confusing count of subarrays
Off-by-one errors in loop conditions
4. The following code tries to find the minimum maximum time to complete tasks by workers using binary search on answer. Identify the bug:
def can_finish(tasks, workers, max_time):
count = 1
current_time = 0
for t in tasks:
if t > max_time:
return False
if current_time + t <= max_time:
current_time += t
else:
count += 1
current_time = t
return count <= workers
tasks = [3, 6, 7, 11]
workers = 2
low, high = 0, sum(tasks)
while low < high:
mid = (low + high) // 2
if can_finish(tasks, workers, mid):
high = mid
else:
low = mid + 1
print(low)
medium
A. The current_time should reset to 0 instead of t after incrementing count
B. The function should return count < workers instead of <= workers
C. The loop condition should be while low <= high
D. Initial low should be max(tasks), not 0
Solution
Step 1: Check initial binary search bounds
Low is set to 0, but minimum max_time must be at least max(tasks) because no task can be split.
Step 2: Understand effect of wrong low
Starting low at 0 causes unnecessary checks and may cause infinite loop or wrong answer.
Final Answer:
Initial low should be max(tasks), not 0 -> Option D
Quick Check:
Low bound must be max task time [OK]
Hint: Set low to max task time to avoid invalid guesses [OK]
Common Mistakes:
Setting low to 0 instead of max(tasks)
Wrong loop condition causing infinite loops
Resetting current_time incorrectly
5. You want to find the minimum largest sum when splitting an array nums into k subarrays. However, some elements can be zero or negative. How should you modify the binary search on answer approach to handle this correctly?
hard
A. Set low to min(nums) and high to sum of absolute values of nums, then apply binary search with adjusted checks.
B. Ignore negative values and treat them as zero, then apply normal binary search on answer.
C. Use normal binary search with low as max(nums) and high as sum(nums) without changes.
D. Sort the array first, then apply binary search on answer with low as 0 and high as sum(nums).
Solution
Step 1: Identify problem with negative and zero values
Negative values can reduce sums, so max(nums) may be negative or zero, and sum(nums) may be less than max(nums).
Step 2: Adjust binary search bounds
Set low to minimum element (which can be negative) and high to sum of absolute values to cover all possible sums.
Step 3: Modify check function
Check function must handle negative sums correctly and validate splits accordingly.
Final Answer:
Set low to min(nums) and high to sum of absolute values of nums, then apply binary search with adjusted checks. -> Option A
Quick Check:
Adjust bounds for negatives and zeros [OK]
Hint: Adjust low/high bounds when negatives exist [OK]
Common Mistakes:
Using max(nums) as low when negatives exist
Ignoring negative values in sums
Assuming sums are always positive
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.