본문 바로가기
PS

백준 1654번 C++ 랜선 자르기

by mtoc 2019. 6. 28.


랜선 자르기

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

집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.

이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm 은 버려야 한다.(이미 자른 랜선은 붙일 수 없다.)

편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.





맞왜틀

영식이는 왜 쓰지도 못할 랜선을 자르는가...

의문은 잠시 미뤄두고, 이분탐색을 쓰면 간단히 해결되는 문제이다.

응 아냐





왜 런타임 에러?

나 같은 경우에는

1
2
3
4
if(sum/mid<N){
            high=mid-1;
            continue;
}
cs

이 부분이 문제였다.

sum은 영식이가 가지고 있던 랜선 길이의 합이고 그걸 low와 high의 평균값으로 나눴을 때 N보다 작으면

그 아래에 있는 반복문 자체를 실행하지 못하게 하기 위함이었는데

low=0, high=max로 초기화해놓은 상태에서 high가 만약 1이라면

mid=(low+high)/2=0이 되어버리기 때문이다.

0으로 숫자를 나누면 당연히 오류가 난다.

그러고나서도 틀린이유는

1
scanf("%lld"&lan[i]);
cs

이 부분 때문이었다.

콘솔에서 자꾸 이상한 값이 나와서 자력으로 해결하긴 했지만 그냥 채점 현황 보니까 알려주더라.

맞왜틀? 하고 있던 분들은 한번 기본적인 것들을 체크해보시길





코드

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
35
36
37
38
#include <iostream>
using namespace std;
int main() {
    int K, N;
    scanf("%d %d"&K, &N);
    long long lan[K], max=0, sum=0;
    for(int i=0; i<K; i++){
        scanf("%lld"&lan[i]);
        sum+=lan[i];
        if(lan[i]>max)
            max=lan[i];
    }
    long long cnt, low=0, high=max, mid, ans=0;
    while(low<=high){
        mid=(low+high)/2;
        if(mid<1)
            mid=1;
        if(sum/mid<N){
            high=mid-1;
            continue;
        }
        cnt=0;
        for(int i=0; i<K; i++){
            if(lan[i]/mid>=1){
                cnt+=lan[i]/mid;
            }
        }
        if(cnt>=N){
            if(mid>ans)
                ans=mid;
            low=mid+1;
        }else{
            high=mid-1;
        }
    }
    printf("%lld", ans);
    return 0;
}
cs


'PS' 카테고리의 다른 글

백준 11723번 C++ 집합 정답률이 낮은 이유  (0) 2019.09.17
백준 1744번 C++ 수 묶기  (0) 2019.06.29
백준 2178번 C++ 미로 탐색  (0) 2019.06.26
백준 9466번 C++ 텀 프로젝트  (0) 2019.06.15
백준 7576번 C++ 토마토  (0) 2019.06.14

댓글