본문 바로가기
알고리즘

백준 s2 16401 과자 나눠주기 c++

by kyj0032 2024. 2. 17.

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

 

16401번: 과자 나눠주기

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

www.acmicpc.net

 

문제 설명과 풀이는 https://kyj0032.tistory.com/52 참고, 거의 유사함.

다만 랜선 자르기 문제는 불가능한 경우의 수가 없었지만, 이 문제는 0을 출력해야 함.

단, 모든 조카에게 같은 길이의 막대과자를 나눠줄 수 없다면, 0을 출력한다.

 

코드

/*boj s2 16401 과자 나눠주기*/
#include <algorithm>
#include <iostream>
#define MAXN 1000010
using namespace std;

int M, N;
long long snack[MAXN];

int cut(long long x) {
    int sum = 0;
    for (int i = 0; i < N; i++) {
        sum += snack[i] / x;
    }

    return sum;
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> M >> N;
    for (int i = 0; i < N; i++)
        cin >> snack[i];

    long long st = 1;
    long long en = 1000000000;

    long long mid;

    while (st < en) {
        mid = (st + en + 1) / 2;
        int res = cut(mid);

        if (res < M)
            en = mid - 1;
        else
            st = mid;
    }

    int res = cut(st);
    if (res < M)
        st = 0;
    cout << st << "\n";
}

'알고리즘' 카테고리의 다른 글

백준 g5 2467 용액 c++  (0) 2024.02.19
백준 s2 2805 나무 자르기 c++  (0) 2024.02.17
백준 s4 1822 차집합 c++  (0) 2024.02.17
백준 s5 10815 숫자 카드 c++  (0) 2024.02.17
백준 s2 1654 랜선 자르기 c++  (0) 2024.02.16