๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐“ก๐“ธ๐“ธ๐“ถ๐Ÿฃ: ๐’œ๐“๐‘”๐‘œ๐“‡๐’พ๐“‰๐’ฝ๐“‚/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด

BOJ1654 : ๋žœ์„ ์ž๋ฅด๊ธฐ (

#include <stdio.h>
#include <algorithm>
#include <iostream>

using namespace std;
int K, N = 0;
unsigned long long length[100000];
int check(unsigned long long min)
{
    int num = 0;
    for (int i = 0; i < K; i++)
    {
        num += (length[i] / min);
    }
    return num;
}

int main()
{

    cin >> K >> N;
    for (int i = 0; i < K; i++)
    {
        cin >> length[i];
    }
    /*sort(length, length + K, greater<unsigned long long>());
    unsigned long long minArray[10000];
    copy(length, length + K, minArray);

    while (1)
    {
        if (check(length, minArray[0]))
        {
            cout << minArray[0];
            return 0;
        }
        else
        {
            minArray[0] /= 2;
            sort(minArray, minArray + K, greater<unsigned long long>());
            //   cout << "min ๊ฐ’ " << minArray[0] << "\n";
        }
    }*/
    sort(length, length + K);
    unsigned long long left = 1, right = length[K - 1];
    int ans;
    //์ด๋ถ„ ํƒ์ƒ‰
    while (left <= right)
    {

        long long mid = (left + right) / 2;

        //mid๊ฐ’์œผ๋กœ ์ž˜๋ž์„๋•Œ ๋‚˜์˜ค๋Š” ๋žœ์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค
        long long cnt = check(mid);

        //mid๊ฐ’์œผ๋กœ ์ž˜๋ผ์„œ ๋‚˜์˜จ ๋žœ์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ n์ด์ƒ์ด๋ฉด ๋” ํฐ ๊ฐ’์œผ๋กœ ์ž˜๋ผ๋„ ๋˜๋ฏ€๋กœ left๊ฐ’์ด ์•ž์œผ๋กœ ๊ฐ„๋‹ค.
        //ํ˜„์žฌ ์ตœ๋Œ€ ๊ธธ์ด๋Š” mid๊ฐ’ ๋งŒํผ ์ž๋ฅธ ๊ฒฝ์šฐ
        if (cnt >= N)
        {
            left = mid + 1;
            ans = mid;
        }
        else
        {
            //ํ˜„์žฌ mid๊ฐ’์œผ๋กœ ๋žœ์„ ์„ ์ž๋ฅด๋ฉด n๊ฐœ๋ฅผ ๋ชป๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ
            //ํฌ๊ธฐ๋ฅด ์ค„์ด๊ธฐ ์œ„ํ•ด right๋ฅผ mid์•ž์ชฝ์œผ๋กœ ๋‹น๊ธด๋‹ค.
            right = mid - 1;
        }
    }

    cout << ans << '\n';

    return 0;
}