알고리즘/BOJ

백준 16401번 과자 나눠주기

꾸준함. 2018. 11. 10. 17:22

문제 링크입니다: https://www.acmicpc.net/problem/16401


low는 1, high는 제일 긴 과자의 길이로 해서 이분 탐색을 통해 나누어줄 수 있는 최대 길이를 구하면 되는 문제였습니다.


#include <iostream>

#include <algorithm>

using namespace std;

 

const int MAX = 1000000;

 

int M, N;

int snack[MAX];

 

bool possible(int len)

{

        int cnt = 0;

        for (int i = 0; i < N; i++)

                 cnt += snack[i] / len;

 

        //조건이 성립할 경우에만 true

        if (cnt >= M)

                 return true;

        return false;

}

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

        cin >> M >> N;

 

        int low = 1, high = 0;

        for (int i = 0; i < N; i++)

        {

                 cin >> snack[i];

                 //제일 긴 과자의 길이가 high

                 high = max(high, snack[i]);

        }

 

        int result = 0;

        //전형적인 이분 탐색

        while (low <= high)

        {

                 int mid = (low + high) / 2;

                 if (possible(mid))

                 {

                         result = mid;

                         low = mid + 1;

                 }

                 else

                         high = mid - 1;

        }

        cout << result << "\n";

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

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

백준 16399번 드라이브  (6) 2018.11.12
백준 16402번 제국  (0) 2018.11.10
백준 16400번 소수 화폐  (0) 2018.11.10
백준 16398번 행성 연결  (0) 2018.11.10
백준 16397번 탈출  (0) 2018.11.10