Practical Applications of Binary Search and Fractional Programming

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;
}

Tags: binary-search ternary-search fractional-programming algorithm Optimization

Posted on Wed, 13 May 2026 19:18:36 +0000 by Ghost_81st