이번에 풀어볼 문제는 실버 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;
}
코드입니다~
더 좋은 풀이, 혹은 잘못된 부분이 있다면 댓글로 남겨주세요~
오늘 하루도 화이팅 입니다~~~