baekjoon-1654-랜선

c4fiber·2022년 3월 4일
0

code-interview

목록 보기
1/12

이분탐색을 재귀로 해결

이상적인 자르기 길이를 이분탐색을 통해서 구한다.

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

int n, k;
vector<long long> lines;

// length 길이로 잘랐을 때 얻을 수 있는 랜선 개수
long long howManyLines(long long length){
    long long t = 0;
    for (int i=0; i<k; i++)
        t += lines[i] / length;
    
    return t;
}

long long getMaxLength(long long min, long long max){
    long long mid = (min + max) / 2;
    long long LANs = howManyLines(mid);

    // 모든 경우에서 mid를 최대로 높이려고 시도한 상태. 수렴한 mid로 결과를 도출할때 LANs 가 n보다 작을 확률이 있음
    if (max - min <= 1){
        if (LANs < n)
            return mid-1;
        else 
            return mid;
    }

    // 랜선 n개 이상을 얻었을 경우 길이를 늘린다. (n개를 얻어도 이 중에서 최대 길이를 찾아야 함)
    return LANs >= n ? getMaxLength(mid+1, max)
        : getMaxLength(min, mid-1);
}

int main() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    
    cin >> k >> n;
    
    for (int i=0; i<k; i++){
        long long line; cin >> line;
        lines.push_back(line);
    }

    cout << getMaxLength(1, pow(2,31)) << "\n";
    cin >> k;
    return 0;
}
profile
amazing idiot

0개의 댓글