본문 바로가기
BaekJoon/C++

1654 : 랜선 자르기 (C++)

by GrayChoi 2021. 2. 10.
반응형

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net


풀기싫어...

#include<iostream>

using namespace std;

int K, N;
unsigned int ans;

int search(unsigned int left, unsigned int right, unsigned int LAN[]) {
    int cnt = 0;
    if(left > right) {
        return -1;
    }

    unsigned int mid = (left + right) / 2;

    for(int i = 0; i < K; i++) {
        cnt += LAN[i] / mid;
    }

    if(cnt >= N) {
    // 자른 갯수가 만들어야 하는 갯수보다 많다면
        ans = max(mid, ans);
        return search(mid + 1, right, LAN);
    } else {
    // 자른 갯수가 만들어야 하는 갯수보다 적다면
        return search(left, mid - 1, LAN);
    }
}

int main() {
    cin >> K >> N;
    
    unsigned int LAN[K];
    int sum = 0;
    int maxLan = 0;

    for(int i = 0; i < K; i++) {
        cin >> LAN[i];
        sum += LAN[i];
        maxLan = maxLan < LAN[i] ? LAN[i] : maxLan;
        // 1부터 최대값까지 탐색을 진행하기 위해 최댓값을 구함.
    }

    search(1, maxLan, LAN);
    // 최소 길이부터 최대 길이까지 탐색 진행.

    cout << ans << endl;

    return 0;
}
반응형

'BaekJoon > C++' 카테고리의 다른 글

1920 : 수 찾기 (C++)  (0) 2021.02.11
2805 : 나무 자르기 (C++)  (0) 2021.02.10
1987 : 알파벳 (C++)  (0) 2021.02.09
1934 : 최소공배수 (C++)  (0) 2021.02.09
1010 : 다리 놓기 (C++)  (0) 2021.02.09

댓글