본문 바로가기
알고리즘/백준 문제

16401 - 과자 나눠주기

by HDobby 2023. 7. 15.

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

주의할 점

  • 답이 0이 나올수도 있다.
  • mid가 0인 경우 l이 0, r이 1인 경우도 포함된다.
  • l과 r이 둘다 0인 경우를 처리하지 않으면 무한루프를 돌게 된다.

예제

3 3
1 1 1



1
3 2
1 1



0
1 1
1000000000


1000000000

코드

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>

using namespace std;

int M, N;
vector<int> snacks;

void input(){
    int snack;

    cin>>M>>N;
    for(int i=0;i<N;++i){
        cin>>snack;
        snacks.push_back(snack);
    }
}

void solution(){
    sort(snacks.begin(), snacks.end(), greater<int>());

    int l=0, r=1'000'000'000;

    while(l<r){
        int mid = (l+r)/2;
        if(l == 0 && r == 0)
            break;

        if(mid == 0){
            mid = 1;
        }

        int cnt = 0;
        for(int i=0;i<N&&cnt<M;++i){
            cnt += snacks[i]/mid;
        }

        if(cnt>=M)
            l = mid + 1;
        else
            r = mid - 1;
    }

    cout<<r<<'\n';
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    solution();

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

14940 - 쉬운 최단거리  (0) 2023.07.17
17609 - 회문  (0) 2023.07.16
22682 - 가장 긴 짝수 연속한 부분 수열 (large)  (0) 2023.07.15
17266 - 어두운 굴다리  (0) 2023.07.15
2179 - 비슷한 단어  (0) 2023.07.14

댓글