๋ฐฑ์ค 22953
๋ฌธ์
ํ์ด
๊ฐ๊ฐ์ ์๋ฆฌ๊ฐ ์ค๋น๋๋ ์๊ฐ์์ 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