Algorithm/BOJ

1654 랜선 자르기

henry1214 2018. 2. 12. 00:16

https://www.acmicpc.net/problem/1654



이분 탐색으로 정답의 범위를 줄여가면서 랜선의 최대 길이를 찾는다. 랜선의 개수가 모자라면 범위를 내리면서 개수를 늘려가고 랜선의 개수가 원하는 개수보다 같거나 크다면 범위를 최대한 올려가면서 랜선의 최대 길이를 찾는다. 이 때 mid가 정답이 되는 것이 아니라 매번 조건을 만족하는지 확인하면서 정답을 갱신해줘야 한다.



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
31
32
33
34
#include <cstdio>
 
long long k,n,ans,lc[10000],max;
 
void bs()
{
    long long left=1,right=max,mid;
    while(left<=right)
    {
        mid=(left+right)/2;
        long long sum=0;
        for(int i=0;i<k;i++)
            sum+=lc[i]/mid;
        if(sum<n) right=mid-1;
        else
        {
            if(ans<mid) ans=mid;
            left=mid+1;
        }
    }
}
 
int main()
{
    scanf("%lld %lld",&k,&n);
    for(int i=0;i<k;i++)
    {
        scanf("%lld",&lc[i]);
        if(max<lc[i]) max=lc[i];
    }
    bs();
    printf("%lld\n",ans);
    return 0;
}
cs