문제
풀이
이분 탐색을 사용한다.
- 점프할 최소거리(mid)를 이분 탐색한다.
- 돌 사이의 거리가 mid 미만이라면 돌을 삭제한다.
- 삭제한 돌의 수와 m을 비교하여 start와 end를 조절한다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> nums;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(nullptr);
int d, n, m;
cin >> d >> n >> m;
for (int i = 0; i < n; ++i)
{
int temp;
cin >> temp;
nums.push_back(temp);
}
// 시작 지점과 끝 지점을 추가
nums.push_back(0);
nums.push_back(d);
sort(nums.begin(), nums.end());
int start = 1;
int end = d;
int answer = 0;
while (start <= end)
{
int mid = (start + end) / 2;
int current_deleted = 0;
int pre_rock = 0;
for (int i = 1; i < nums.size(); ++i)
{
// 돌 사이에 mid만큼의 거리가 안 된다면 돌을 삭제
if (nums[i] - nums[pre_rock] < mid)
{
current_deleted++;
}
else
{
// 삭제하지 않았을 경우엔 이전 돌을 갱신
pre_rock = i;
}
}
// 삭제한 돌의 수와 m을 비교
if (current_deleted > m)
{
end = mid - 1;
}
else
{
answer = mid;
start = mid + 1;
}
}
cout << answer;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 2352: 반도체 설계 (0) | 2023.11.05 |
---|---|
[백준][C++] 3079: 입국심사 (0) | 2023.11.04 |
[백준][C++] 16434: 드래곤 앤 던전 (1) | 2023.11.02 |
[백준][C++] 1477: 휴게소 세우기 (1) | 2023.11.01 |
[백준][C++] 9024: 두 수의 합 (1) | 2023.10.31 |