[2110] 공유기 설치
https://www.acmicpc.net/problem/2110
한줄 후기 : 재작년 스터디때 푼 것들
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,c;
vector<int> v;
bool check(long long x){
int temp = 1;
int t=v[0];
for(int i=0; i<n; i++){
if(v[i]-t >= x){
t = v[i];
temp++;
}
}
if(temp >= c) return true;
else return false;
}
int main(){
int m;
scanf("%d %d", &n, &c);
for(int i=0; i<n; i++){
scanf("%d", &m);
v.push_back(m);
}
sort(v.begin(), v.end());
long long mid, l=1, r, ans=0;
r = v[n-1]-v[0];
while(l<=r){
mid = (l+r)/2;
if(check(mid)){
l = mid+1;
if(ans < mid){
ans = mid;
}
}
else{
r = mid - 1;
}
}
printf("%lld", ans);
return 0;
}
이분탐색은 기준 잡기가 너무 어렵다. 공유기 설치도 처음에 기준을 잘못 잡아서 헤맸었음. 공유기 설치는 인접한 공유기 거리를 기준으로 그 거리가 성립할 수 있는지 없는지를 봐야한다. left 는 당연히 1이고, right는 가장 먼 거리, 정렬한 벡터의 [n-1]- [0] 값이다.
여기까지 하면 나머지는 이분탐색으로 돌면서 현재의 mid 값을 만족하는 지 아닌지 check 함수에서 검사 후 만족한다면 거리를 더 키워도 되므로 left = mid +1 만족하지 않는다면 right = mid -1 을 해줘야 한다. 이분 탐색은 너무 어려워.
'DEV > PS' 카테고리의 다른 글
[1018] 체스판 다시 칠하기, c++ (0) | 2021.02.06 |
---|---|
[2512] 예산, c++ (0) | 2021.02.06 |
[2012] 등수 매기기, c++ (0) | 2021.02.06 |
[17241] Pineapple Advertising, c++ (0) | 2021.02.06 |
[1699] 제곱수의 합, c++ (0) | 2021.02.06 |