와우
어려웠다
뭔가 범위로 어찌저찌 해야한다는 느낌은 왔는데 느낌만 오고 어떻게 다뤄야할지 모르겠다. 그래서 결국 도움 받아서 풀었다.
먼저 범위 기준을 가장 인접한 길이로 잡고 그 길이에 맞춰 반씩 범위를 줄인다.
범위를 확인하는 함수는 일정한 길이가 주어질 때 공유기 갯수로 확인한다. 공유기 갯수가 C개 이상이라면 그 길이가 적당한거고 갯수가 C개 미만이라면 길이가 너무 길다는 것이다.
코드는 이렇게 짰다. 여기서 다 int형으로 했는데 나중에 문제 확인해보니 터질 것 같아서 long long으로 바꿔줬다. 그리고 count도 0으로 했는데 항상 맨 처음거에 공유기를 두기 때문에 count를 1로 뒀다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;
bool check(int mid, int c, vector<i64> v){
int count = 1;
i64 before = v[0];
for(int i = 1; i < v.size(); i++){
if(v[i] - before >= mid){
count++;
before = v[i];
}
}
if(count >= c)
return true;
return false;
}
int main() {
int n, c;
scanf("%d %d", &n, &c);
vector<i64> v(n);
for(int i = 0; i < n; i++)
scanf("%lld", &v[i]);
sort(v.begin(), v.end());
i64 low = 1;
i64 high = v[n-1] - v[0] + 1;
while(true){
if(low == high - 1)
break;
i64 mid = (low + high)/2;
if(check(mid, c, v))
low = mid;
else
high = mid;
}
printf("%lld", low);
}
맞았다...! 또 틀릴 줄 알았는데 맞아서 먼가 싱숭생숭,, 실력이 좀 쌓였으면 좋겠다.
'백준' 카테고리의 다른 글
2792 보석상자 (0) | 2019.11.10 |
---|---|
3079 입국심사 (0) | 2019.11.10 |
2512 예산 (0) | 2019.11.06 |
1654 랜선 자르기 (0) | 2019.11.06 |
2805 나무 자르기 (0) | 2019.11.05 |