λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 14627번 - νŒŒλ‹­νŒŒλ‹­

by μ•ˆμ£Όν˜• 2022. 9. 13.

문제

 

14627번: νŒŒλ‹­νŒŒλ‹­

첫째 쀄에 μŠΉκ· μ΄κ°€ μ‹œμž₯μ—μ„œ 사 온 파의 개수 S(1 ≤ S ≤ 1,000,000), 그리고 주문받은 νŒŒλ‹­μ˜ 수 C(1 ≤ C ≤ 1,000,000)κ°€ μž…λ ₯λœλ‹€. 파의 κ°œμˆ˜λŠ” 항상 νŒŒλ‹­μ˜ 수λ₯Ό λ„˜μ§€ μ•ŠλŠ”λ‹€. (S ≤ C) κ·Έ ν›„, S 쀄에

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>

#define ll long long int
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    ll S, C; cin>>S>>C;
    vector<ll> v(S);
    for(int i=0; i<S; i++) cin>>v[i];
    
    ll start = 1, end = 1e9;
    ll mod = 0, sum = 0;
    
    while(start <= end){
        ll mid = (start + end) / 2;
        ll sum = 0;
        for(int i=0; i<v.size(); i++){
            if(v[i] >= mid) sum += v[i] / mid;
        }
        if(sum >= C){
            mod = mid;
            start = mid + 1;
        }
        else end = mid - 1;
    }
    
    for(int i=0; i<v.size(); i++) sum += v[i];
    cout<< sum - mod * C;
}

 

풀이

νŒŒλ‹­ ν•˜λ‚˜λ‹Ή 넣을 수 μžˆλŠ” μ΅œλŒ€ 파의 길이λ₯Ό 이뢄 탐색을 ν†΅ν•΄μ„œ μ •ν•΄μ€λ‹ˆλ‹€. μ •ν•œ 파의 길이λ₯Ό 계속 이뢄 탐색을 톡해 κ°±μ‹ ν•˜κ³ , μ΅œμ’…μ μœΌλ‘œ (λͺ¨λ“  파의 μ–‘) - (λ‹­ 개수 * νŒŒλ‹­ ν•˜λ‚˜λ‹Ή 넣을 수 μžˆλŠ” μ΅œλŒ€ 파의 길이)λ₯Ό λΉΌμ£Όλ©΄ 정닡이 λ©λ‹ˆλ‹€.

λŒ“κΈ€