P9455 塔台超频 (二分+贪心

#include 
using namespace std;
using VI = vector;
using PII = pair;
using ll = long long;
using ull = unsigned long long;
int n;
int a[2000010];
int b[2000010];

int check(int mid){

    int j = 1;
    for(int i=2;i<=n;i++){
        int r = 0;
        int t = j;
        while(i<=n && a[j] + b[j] + mid >= a[i]){
            if(a[i] + b[i] + mid > r){
                r = a[i] + b[i] + mid;
                t = i;
            }
            i++;
        }
        i--;
        j = t;
        if(r == 0) return 0;
        if(r >= a[n]) return 1;
    }

    return 0;
}




int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
    }
    int left = 0;
    int right = a[n] - b[n];
    while(left < right){
        int mid = (left + right) >> 1;
        if(check(mid)){
            right = mid;
        }else{
            left = mid + 1;
        }
    }
    //cout<

二分了一下,跑了个区间覆盖

你可能感兴趣的:(基本算法,算法,数据结构)