Binary search is a fundamental algorithm with applications in various computational problems. The key considerations when implementing binary search include identifying the search target, determining search boundaries, and designing the validation function.
Music Notes Timing Analysis
Determine the number of songs played within a given time frame by tracking start times and performing binary search:
vector<int> song_starts;
int find_song_count(int time) {
int left = 0, right = song_starts.size() - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (song_starts[mid] <= time) {
result = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return result + 1;
}
Perfect Square Count
Count perfect squares within a range using binary search to find boundary values:
int count_perfect_squares(int start, int end) {
int lower = sqrt(start);
if (lower * lower < start) lower++;
int upper = sqrt(end);
return upper - lower + 1;
}
Stone Jumping Problem
Calculate maximum jump distance by validating midpoints through binary search:
bool validate_jump(int distance, vector<int>& stones, int max_removals) {
int removed = 0, last = 0;
for (int stone : stones) {
if (stone - last < distance) {
if (++removed > max_removals) return false;
} else {
last = stone;
}
}
return true;
}
Classroom Allocation
Binary search combined with difference arrays efficiently solves clasroom scheduling:
bool validate_orders(int day, vector<int>& rooms, vector<Request>& requests) {
vector<int> diff(rooms.size() + 2);
for (int i = 1; i <= day; i++) {
diff[requests[i].start] += requests[i].amount;
diff[requests[i].end + 1] -= requests[i].amount;
}
int current = 0;
for (int i = 1; i <= rooms.size(); i++) {
current += diff[i];
if (current > rooms[i]) return false;
}
return true;
}
Fractional Programming
01 Fractional Programming maximizes ratios through binary search:
bool validate_ratio(double target, vector<Item>& items, int k) {
vector<double> scores;
for (auto& item : items) {
scores.push_back(item.value - target * item.cost);
}
sort(scores.rbegin(), scores.rend());
double sum = accumulate(scores.begin(), scores.begin() + k, 0.0);
return sum >= 0;
}
Equipment Synthesis
Ternary search finds optimal production quantities:
int calculate_output(int x, int material1, int material2) {
int remaining1 = material1 - 4 * x;
int remaining2 = material2 - x;
return x + min(remaining1 / 2, remaining2 / 3);
}
Transportation Optimization
Nested ternary search minimizes travel time across multiple paths:
double calculate_path_time(double ab_ratio, double cd_ratio, Point A, Point B, Point C, Point D) {
Point X = interpolate(A, B, ab_ratio);
Point Y = interpolate(C, D, cd_ratio);
return distance(A, X)/p + distance(X, Y)/r + distance(Y, D)/q;
}