Binary Search Templates and Median Optimization for Resource Distribution

Binary Search Implemantation Patterns

Two common binary search variations address different optimization scenarios:

Maximizing Minimum Value

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool validateMin(vector<long>& positions, long min_gap, int removals) {
    long prev = 0;
    int count = 0;
    for (int i = 1; i < positions.size(); i++) {
        if (positions[i] - prev < min_gap) count++;
        else prev = positions[i];
    }
    return count <= removals;
}

long findMaxMin(vector<long>& positions, long total_length, int removals) {
    long left = 0, right = total_length;
    while (left < right) {
        long mid = (left + right + 1) / 2;
        if (validateMin(positions, mid, removals)) left = mid;
        else right = mid - 1;
    }
    return left;
}

Minimizing Maximum Value

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool validateMax(vector<long>& positions, long max_gap, int removals) {
    long prev = 0;
    for (int i = 1; i < positions.size(); i++) {
        prev += (positions[i] - positions[i-1] - 1) / max_gap;
    }
    return prev <= removals;
}

long findMinMax(vector<long>& positions, long total_length, int removals) {
    long left = 0, right = total_length;
    while (left < right) {
        long mid = (left + right) / 2;
        if (validateMax(positions, mid, removals)) right = mid;
        else left = mid + 1;
    }
    return left;
}

Element Insertion Operation

void insertElement(vector<int>& arr, int index, int value) {
    if (index < arr.size()) {
        arr.insert(arr.begin() + index, value);
    }
}

Candy Distribution Optimization

Given n children with candy amounts, minimize transfers to equalzie distribution. Mathematical derivation shows the meedian of cumulative differences minimizes total operations.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

long minimizeTransfers(vector<long>& candies) {
    long total = 0;
    for (long c : candies) total += c;
    long average = total / candies.size();
    
    vector<long> accum(candies.size(), 0);
    for (int i = 1; i < candies.size(); i++) {
        accum[i] = accum[i-1] + candies[i-1] - average;
    }
    
    sort(accum.begin(), accum.end());
    long median = accum[accum.size() / 2];
    long operations = 0;
    for (long val : accum) {
        operations += abs(median - val);
    }
    return operations;
}

Tags: binary-search median-algorithm C++ luogu greedy

Posted on Wed, 10 Jun 2026 17:50:35 +0000 by cedartree