algorithm

๋ฐฑ์ค€ 22953

rkawk 2024. 7. 30. 23:30

๋ฌธ์ œ

ํ’€์ด

๊ฐ๊ฐ์˜ ์š”๋ฆฌ๊ฐ€ ์ค€๋น„๋˜๋Š” ์‹œ๊ฐ„์—์„œ 1์”ฉ ๋นผ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์—์„œ T ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์„ ๊ฒฝ์šฐ ์ตœ์†Œ K๊ฐœ์˜ ์š”๋ฆฌ๊ฐ€ ์กฐ๋ฆฌ๋˜๋Š” T์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์šฐ์„  ๊ฐ๊ฐ์˜ ์š”๋ฆฌ์—์„œ 1์”ฉ ๋นผ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์š”๋ฆฌ์‚ฌ์˜ ์ˆ˜ N, ๊ฒฉ๋ ค ํšŸ์ˆ˜ C์ผ๋•Œ O(N^C)๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

์ด๋•Œ ๊ฒฉ๋ ค๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ K๊ฐœ์˜ ์š”๋ฆฌ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ๋œ๋‹ค.

์ด ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ๊ณ ๋ฏผ์ด ๋ฌ๋Š”๋ฐ, 1๊ฐœ์˜ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์กฐ๋ฆฌ์‹œ๊ฐ„์ด 10^6์ผ๋•Œ, 10^6๊ฐœ์˜ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์‹œ๊ฐ„์˜ ์ตœ์•…์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ 10^12์ด๋‹ค. 

๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ˆ˜๋ฅผ hi, 0์„ lo๋ผ ๋‘๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ์ƒ‰์„ ํ•˜์—ฌ K๊ฐœ ์ด์ƒ์˜ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ–ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ• ๋•Œ check๊ฐ€ K ์ด์ƒ์ผ ๊ฒฝ์šฐ hi = mid๋ฅผ ํ–ˆ์œผ๋ฏ€๋กœ hi๊ฐ€ K ์ด์ƒ์ธ ๊ฒฝ์šฐ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ฒฐ๊ตญ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค๋Š”๊ฒŒ ํฌ์ธํŠธ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^C * log10^12 * N)์ด๋‹ค.

 

#include <iostream>
using namespace std;
long long N, K, C, arr[11], ans = 1000000000001;
void solve(int c, int l) {
    if(c == 0) {
        long long lo = 0, hi = 1000000000000;
        while(lo+1 < hi) {
            long long mid = (lo+hi)/2;
            long long check = 0;
            for(int i=0; i<N; i++) {
                check += mid/arr[i];
            }
            if(check >= K) hi = mid;
            else lo = mid;
        }
        ans = min(ans, hi); 
        return;
    }
    for(int i=l; i<N; i++) {
        if(arr[i] == 1) {
            if(i == N-1) solve(0, i);
            continue;
        }
        arr[i] -= 1;
        solve(c-1, i);
        arr[i] += 1;
    }
}
int main() {
    cin>>N>>K>>C;
    for(int i=0; i<N; i++) cin>>arr[i];
    solve(C, 0);
    cout<<ans;
}

//3 6 0
//1 2 3
// 4