백준 1114 통나무자르기

문제

최댓값을 최소로

풀이

이분탐색 + Greedy

이분탐색까진 그렇다치고 어떤 조각이 가장 먼저 잘리는지까지도 그렇다치는데 답이 여러개라면 ==더 작은 위치를 구하라는 것이 어려웠다.==

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> pos;
int c, l, k;

// 가장 긴 조각이 h 이하로 자를 수 있는가
bool decision(int h) {
    int cut=0, sum=0;
    for(int i=1; i<pos.size(); ++i) {
        if(pos[i]-pos[i-1]>h)
            return false;
        if(sum+pos[i]-pos[i-1]>h) {
            cut++;
            sum=pos[i]-pos[i-1];
        } else {
            sum+=pos[i]-pos[i-1];
        }
    }
    return cut<=c;
}

int optimize() {
    long long lo=0, hi=l;
    while(lo+1<hi) {
        long long mid=(lo+hi)/2;
        if(decision(mid))
            hi=mid;
        else
            lo=mid;
    }
    return hi;
}
int main() {
    cin >> l >> k >> c;
    pos.resize(k+1, 0);
    for (int i = 1; i <=k; ++i) {
        cin>>pos[i];
    }
    pos.emplace_back(l);
    sort(pos.begin(), pos.end());

    int ret=optimize(), index=k, sum=0;
    for(int i=pos.size()-1; i>0; --i) {
        if(sum+pos[i]-pos[i-1]>ret) {
            sum=pos[i]-pos[i-1];
            c--;
            index=i;
        } else {
            sum+=pos[i]-pos[i-1];
        }
    }
    if(c>0) index=1;
    cout<<ret<<" "<<pos[index];
    //std::cout << "Hello, World!" << std::endl;
    return 0;
}

이분탐색 어려워…


[jungin]
Written by@[jungin]
안녕하세요

GitHub