문제 설명

문제 링크

http://icpc.me/16401

 

16401번: 과자 나눠주기

첫째 줄에  조카의 수 M (1 ≤ M ≤ 1,000,000), 과자의 수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 과자 N개의 길이 L1, L2, ..., LN이 공백으로 구분되어 주어진다. 과자의 길이는 (1 ≤ L1, L2, ..., LN 

www.acmicpc.net

풀이

결정문제로 바꿔 이분 탐색을 하여 풀 수 있다.

m명에게 길이가 n인 과자를 줄 수 있는지 없는지 판단하는 문제로 바꿔, 길이 n을 이분탐색을 돌리면 된다.

이렇게 풀면 O(NlogN)에 풀 수 있다.

코드

#include <cstdio>

int arr[1000006];

int main() {
    int m, n; scanf("%d %d", &m, &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", arr + i);
    }
    int l = 0, r = 1e9, mid;
    while (l + 1 < r) {
        mid = (l + r) >> 1;
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += (arr[i] / mid);
        }
        if (sum < m) r = mid;
        else l = mid;
    }
    printf("%d", l);
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[14428] 수열과 쿼리 16  (0) 2021.10.14
백준[20164] 홀수 홀릭 호석  (0) 2021.10.14
백준[2239, 2580] 스도쿠  (0) 2021.10.14
백준[14500] 테트로미노  (0) 2021.10.13
백준[20551] Sort 마스터 배지훈의 후계자  (0) 2021.10.11
복사했습니다!