• toc {:toc}

2110: 곡유기 μ„€μΉ˜ 문제 ν™•μΈν•˜κΈ°

풀이

λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” κ°€μž₯ μΈμ ‘ν•œ 두 곡유기 μ‚¬μ΄μ˜ 거리λ₯Ό κ°€λŠ₯ν•œ 크게 ν•˜λŠ” 것은 κ²°κ΅­ μ΅œλŒ€ν•œ μ„œλ‘œμ˜ 간격이 λ²Œμ–΄μ§€λŠ” 것을 μ˜λ―Έν•˜κ³ , μ΅œλŒ€ν•œ λ²Œμ–΄μ‘Œμ„ λ•Œμ˜ κ°„κ²©μ—μ„œ μ΅œμ†Œλ₯Ό μ˜λ―Έν•œλ‹€. λ•Œλ¬Έμ— λΉ„μŠ·ν•œ 간격을 μ„€μ •ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν–ˆλ‹€.

  1. μ²˜μŒμ—λŠ” μ£Όμ–΄μ§„ μ§‘λ“€μ˜ 간격을 μ „λΆ€ λ½‘μ•„λ‚΄μ•Όν•˜λ‚˜?
  2. 처음, 끝을 곡유기 μ„€μΉ˜ν•˜κ³  μ΄λΆ„νƒμƒ‰ν•˜λ©΄μ„œ mid λ₯Ό μ„€μΉ˜ν•  μ§‘μœΌλ‘œ μ„ νƒν•˜λŠ” 방식?

μ΄λ ‡κ²Œ μƒκ°ν–ˆμœΌλ‚˜ μ‹œκ°„μ μΈ 뢀뢄도 κ·Έλ ‡κ³ , 2 번의 경우 λ­”κ°€ μž¬κ·€μ μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•  것 같은데 될 것 κ°™μ§€ μ•Šμ•˜λ‹€. 1 μ‹œκ°„ 정도 λΆ™μž‘κ³  μžˆμ–΄λ΄€λŠ”λ° 아이디어가 λ– μ˜€λ₯΄μ§€ μ•Šμ•„ 풀이λ₯Ό μ°Ύμ•„λ΄€λ‹€. μ•Œκ³ λ¦¬μ¦˜μ„ ν™•μΈν•˜κ³  μ½”λ“œλŠ” 슀슀둜 μž‘μ„±ν•΄λ΄€λ‹€.

아이디어 ꡬ쑰

ꡳ이 μž…λ ₯받은 μ§‘λ“€μ˜ 간격을 κ°€μ§€κ³  비ꡐ해 풀이할 ν•„μš” μ—†κ³ , mid λ₯Ό μ΅œμ†Œ κ°„κ²©μœΌλ‘œ μ„€μ •ν•΄μ„œ ν’€μ΄ν•œλ‹€λŠ” 아이디어이닀.

  1. μž…λ ₯받은 집을 μ •λ ¬ν•œλ‹€. (μ΄λΆ„νƒμƒ‰ν•˜κΈ° μœ„ν•΄)
  2. κ°„κ²©μ˜ μ΅œμ†Œ, μ΅œλŒ€λ₯Ό start 와 end 둜 μ„€μ •ν•œλ‹€.
  3. μ§‘λ“€κ°„μ˜ 간격이 mid 보닀 κΈΈλ‹€κ³  ν•˜λ©΄ μ΅œμ†Œ 간격은 μΆ©μ‘±ν–ˆκΈ° λ•Œλ¬Έμ— 곡유기λ₯Ό μ„€μΉ˜ν•œλ‹€.
  4. 집을 λͺ¨λ‘ λŒμ•„λ‹€λ‹ˆλ©΄μ„œ ν™•μΈν•˜κ³  곡유기 μ„€μΉ˜ κ°œμˆ˜κ°€ μš”κ΅¬λœ 개수λ₯Ό μΆ©μ‘±ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
  5. μ΄λ ‡κ²Œ μš”κ΅¬λ₯Ό μΆ©μ‘±ν•œ 간격듀 쀑 μ΅œλŒ€λ₯Ό 좜λ ₯ν•œλ‹€.
#include <bits/stdc++.h>
using namespace std;
 
int N, C;
vector<int> home;
 
int search(int start, int end){
    int mid, res=0, cnt;
    while(start <= end){
        mid = (start + end) / 2;
 
        int installed = home[0];       
        cnt = 1;
        for (int i=0; i<N; i++){
            if (home[i]-installed >= mid){
                cnt++;
                installed = home[i];
            }
        }
 
        if(cnt >= C){
            res = max(res, mid);
            start = mid+1;
        }
        else end = mid-1;
    }
 
    return res;
}
 
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
 
    int val;
 
    cin >> N >> C;
    
    for(int i=0; i<N; i++){
        cin >> val;
        home.push_back(val);
    }
    sort(home.begin(),home.end());
 
    int min_dist = 1;
    int max_dist = home[N-1]-home[0];
    cout << search(min_dist, max_dist) << '\n';
 
 
    return 0;
}