알고리즘/문제 풀이

1654번: 랜선 자르기

Themion 2021. 12. 9. 10:13

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

 

1654번: 랜선 자르기

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

www.acmicpc.net

랜선의 길이 범위가 자연수 int 범위 이내이고, 문제가 랜선의 길이 범위 이내에서 랜선을 자를 최적의 길이를 찾는 문제이므로 이분 탐색을 실행할 수 있다.

#include <cstdio>

typedef unsigned int ui;

#define MAX_K 10000

ui K, N, cable[MAX_K];

// 모든 랜선을 길이 mid로 잘랐을 때 랜선을 N개 이상 얻을 수 있다면 true
bool cable_cut(ui mid) {
    // 모든 랜선을 mid개로 잘라 얻은 개수를 sum에 저장
    ui sum = 0;
    for (int i = 0; i < K; i++) sum += cable[i] / mid;
    // 얻은 랜선 수가 N개 이상인지 여부를 반환
    return sum >= N;
}

int main() {
    // min, max, mid: 이분 탐색에 사용할 랜선을 자를 길이
    ui min = 1, max = __INT_MAX__, mid = (min + max) / 2;

    // 문제의 조건을 입력받은 뒤
    scanf("%d %d", &K, &N);
    for (int i = 0; i < K; i++) scanf("%d", cable + i);

    // 자를 랜선 길이에 대해 이분 탐색을 실행해 최적의 길이를 찾는다
    while (min <= max) {
        if (cable_cut(mid)) min = mid + 1;
        else                max = mid - 1;
        mid = (min + max) / 2;
    }

    // 랜선을 잘라 N개 이상 얻을 수 있는 최소의 길이를 출력
    printf("%d\n", mid);

    return 0;
}

 

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1697번: 숨바꼭질  (0) 2021.12.09
1676번: 팩토리얼 0의 개수  (0) 2021.12.09
1647번: 도시 분할 계획  (0) 2021.12.09
1644번: 소수의 연속합  (0) 2021.12.09
1629번: 곱셈  (0) 2021.12.09