• toc {:toc}

image

문제 ν™•μΈν•˜κΈ°

풀이

μ΅œλŒ€ 길이λ₯Ό ꡬ해야 ν•˜κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ λ§Œλ“  λžœμ„ μ˜ μˆ˜μ™€ ν•„μš”ν•œ 개수의 κ°™λ‹€κ³  λ°”λ‘œ 값을 λ°˜ν™˜ν•˜λ©΄ μ•ˆ λœλ‹€. μ—¬λŸ¬ κ²½μš°κ°€ λ‚˜μ˜¬ 수 있기 λ•Œλ¬Έμ΄λ‹€. 11κ°œκ°€ ν•„μš”ν•  λ•Œ 802, 743, 457, 539 의 경우만 ν•˜λ”λΌλ„ 200이 λ‹΅μ΄μ§€λ§Œ 199, 198, … λ§Žμ€ 닡이 λ‚˜μ˜¬ 수 있고 이 쀑 μ΅œλŒ€μ˜ 값을 κ°€μ Έμ•Ό ν•œλ‹€. λ•Œλ¬Έμ— 같을 λ•Œμ—λ„ κ³„μ†ν•΄μ„œ mid+1둜 κ°±μ‹ ν•˜λ©° startκ°€ end보닀 크게 λ˜λŠ” κ²½μš°λŠ” endκ°€ 더 이상 컀질 수 μ—†λŠ” 것과 λ§ˆμ°¬κ°€μ§€μ΄κΈ° λ•Œλ¬Έμ— endλ₯Ό λ°˜ν™˜ν•œλ‹€.

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
 
int K, N;
int lan[10005];
 
int search(LL start, LL end){
    LL sum, mid;
    while(start <= end){
        sum = 0;
        mid = (start + end)/2;
        for(int i=0; i<K; i++){
            sum += lan[i] / mid;
        }
        if (sum >= N) start = mid + 1;
        else end = mid - 1;
    }
    return end;
}
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
 
    LL val, high=0;
 
    cin >> K >> N;
    
    for(int i=0; i<K; i++){
        cin >> lan[i];
        if (high < lan[i]) high=lan[i];
    }
 
    cout << search(1, high) << '\n';
 
    
 
    return 0;
}