백준 2512 예산

hyoJeong·2021년 5월 19일
0

이번에 풀어볼 문제는 실버 3에 해당하는 문제입니다.
문제:https://www.acmicpc.net/problem/2512
M은 N이상 1,000,000,000이하 이기 때문에 브르투 포스로 풀경우,
1초안에 풀지 못하기 때문에 시간초과가 발생합니다.
따라서 시간 복잡도가 log2n(밑이 2인 로그)에 해당하는 알고리즘인 이분탐색을 활용해 풀었습니다.

#include <iostream>
#include <algorithm>
#include <vector>
typedef long long ll;
using namespace std;

int main(){
    
    cin.tie(0);
    cout.tie(0);
    ll n,m;
    cin>>n;
    vector<int> v(n);
    ll sum=0;
    for(int i=0;i<n;i++){
        cin>>v[i];
        sum+=v[i];
    }
    cin>>m;
    sort(v.begin(),v.end());
    ll lt,rt,mid=0;
    lt=1;
    ll res=0;
    //예산중 최대값을 넘지 않음
    rt=v[n-1];
    
        while(lt<=rt){
            sum=0;
            mid=(lt+rt)/2;
            for(int i=0;i<n;i++){
                if(v[i]<=mid){
                    sum+=v[i];
                }
                else{
                    sum+=mid;
                }
            }
            //가지고 있는 예산보다 나눠줄 돈이 더 큰경우
            //rt의 범위를 줄인다.
            if(sum>m){
                rt=mid-1;
            }
            //가지고 있는 예산보다 더 나눠줄 수 있는경우
            //lt의 범위를 늘린다.
            else{
                res=max(res,mid);
                lt=mid+1;
            }
            
            
            
            
            
            
        }
        
        
        
        
    
    
    cout<<res<<"\n";
    
    
    return 0;
}

코드입니다~
더 좋은 풀이, 혹은 잘못된 부분이 있다면 댓글로 남겨주세요~
오늘 하루도 화이팅 입니다~~~

0개의 댓글