C - Medicine Editorial by dyktr_06


飲む必要のある薬の個数は、日数が経過していくにつれて広義単調減少していきます。

よって、答えを二分探索することによりこの問題に正解することができます。

計算量は \(O(N \log \max a)\) です。

#include <bits/stdc++.h>
 
using namespace std;
 
int main(){
    int n, k; cin >> n >> k;
    vector<int> a(n), b(n);
    for(int i = 0; i < n; i++){
        cin >> a[i] >> b[i];
    }
    int ok = 1 << 30, ng = 0;
    while(abs(ok - ng) > 1){
        int mid = (ok + ng) / 2;
        long long sum = 0;
        for(int i = 0; i < n; i++){
            if(mid <= a[i]){
                sum += b[i];
            }
        }
        if(sum <= k){
            ok = mid;
        }else{
            ng = mid;
        }
    }
    cout << ok << endl;
}

posted:
last update: