본문 바로가기

Algorithm

C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 1654번:랜선 자르기 답

반응형

이분탐색 문제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//랜선을 잘랐을 때 개수가 N보다 작으면 x값을 줄인다.
//         "            N보다 크면 x값을 늘린다.
#include <iostream>
using namespace std;
long long k,n,a[10001],cnt,l,r,big,ans;
int main() {
    cin >> k >> n;
    for (int i = 0; i < k; i++)
    {
        cin >> a[i];
        if (big < a[i])//최대값을 저장
            big = a[i];
    }
    l = 1;
    r = big;
    while (l<=r)
    {
        long long mid = (l+r) / 2;
        cnt = 0;
        for (int i = 0; i < k; i++)
            cnt += a[i] / mid;
        if (cnt < n) { r = mid-1; }//랜선을 자른 결과가 만드려는 랜선의 개수보가 작다면 랜선을 더 작게 잘라야함 그러므로 mid-1
        else //랜선을 더 크게 잘라야할 경우 
        { 
            if (ans < mid) { ans = mid; }//가장 큰 값을 저장
            l = mid + 1;
        }
    }
    cout << ans << '\n';
}
cs