[ 백준 ] 2792 / 보석 상자

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
69/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2792 / 보석 상자
 *
 * Kind :: Binary Search
 *
 * Insight
 * - 음...
 *   처음부터 질투심을 정해놓고 배분하면 되려나?
 *   보석을 받지 못하는 학생이 있어도 되니까
 *   + 질투심 10 으로 나누어주었을 때
 *     가능하면 질투심 9 로도 해보고...
 *     이분탐색..?
 *     # 질투심 증가 / 받는 학생수 감소
 *       질투심 감소 / 받는 학생수 증가
 *       단조함수 => 이분탐색으로 풀면 되겠다!
 *
 * Point
 * - l, r 잡을 때 Overflow 조심심
 *   받는 학생수 계산할 때도 Overflow 조심
 *   + long 으로 선언해주자
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, M;
    cin >> N >> M;
    int K[M];
    for (int i=0; i<M; i++)
        cin >> K[i];

    // Process
    int ans = -1;
    /* 최소 질투심 = m1
     * 최대 질투심 = max(K번 색상 보석의 개수) */
    long l = 1, r = *max_element(K, K+M);
    while (l <= r) {
        long m = (l+r)/2; /* 현재 질투심 */
        long cnt = 0; /* 받는 학생수 */
        for (int k : K) {
            cnt += (k+m-1)/m;
        }

        /* 현재 질투심으로 나누어 줄 수 있다면 */
        if (cnt <= N) {
            ans = m;
            r = m-1;
        /* 현재 질투심으로 나누어 줄 수 없다면 */
        } else {
            l = m+1;
        }
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글