반응형
리뷰
https://www.acmicpc.net/problem/1477
이분 탐색을 통해 휴게소를 m개 세웠을때 휴게소간 거리가 최소가 되게 만들어 주는 문제
전역 변수
- n, m, l : 현재 설치된 휴게소의 개수n, 추가로 설치해야 하는 휴게소의 개수m, 도로의 길이 l
- ans : 휴게소간 거리가 최소가 되는 경우의 정답
- lst : 설치되어있는 휴게소의 정보를 담은 정수형 배열
함수
없음
문제풀이
- n, m, l값을 입력 받고, n개의 수를 lst배열에 입력 받은 뒤 lst배열을 정렬 해준다.
- 만약 n이 0일 경우 ans는 l / (m + 1)을 올림 처리한 값으로 ans에 저장한다.
- n이 0이 아닐 경우 이분탐색을 진행해 준다.
- 왼쪽 탐색 시작은 left = 1로, 오른쪽 탐색 시작은 최대 도로 보다 두배 큰 right = 2000으로 초기화 했다.
- left가 right보다 작거나 같을 경우 이분탐색을 계속 진행해 준다.
- mid를 l + r을 2로 나눈 몫으로 설정해 준다. cur은 현재 위치이고, install은 설치한 개수로 모두 0으로 초기화 한다.
- 이미 설치된 휴게소를 순회한다, 현재 위치에서 i번째 휴게소에 mid거리로 도착할 수 있다면 cur을 휴게소로 바꿔준다.
- 만약 mid거리로 도착할 수 없다면 cur에 mid를 더해주고 install을 1증가시켜준다.
- 모든 휴게소에 대한 탐색을 마치면 cur은 마지막 휴게소의 위치에 있을 것이다.
- 마지막 휴게소의 위치에서 도로의 끝인 l까지 가는 길도 똑같이 진행해 준다.
- 만약 install이 m보다 작거나 같을 경우 right을 mid - 1로, ans를 mid와 ans중 작은 값으로 최신화 해준다.
- 만약 install이 m보다 클 경우 left를 mid + 1로 바꾸어 준다.
- 모든 이분 탐색을 마친 후 ans에 저장된 값을 출력해 준다.
참고 사항
mid가 휴게소간 거리를 의미하며, 이 값이 최소가 되는 값을 구하는 것이 목적이다.
정답 코드
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n, m, l, ans = 1e9;
int lst[50];
int main() {
cin >> n >> m >> l;
for (int i = 0; i < n; i++) cin >> lst[i];
sort(lst, lst + n);
if (!n) ans = ceil((double)l / (m + 1));
else {
int left = 1, right = 2000;
while (left <= right) {
int mid = (left + right) / 2;
int cur = 0;
int install = 0;
for (int i = 0; i < n; i++) {
while (cur + mid < lst[i]) {
cur += mid;
install++;
}
cur = lst[i];
}
while (cur + mid < l) {
cur += mid;
install++;
}
if (install <= m) {
right = mid - 1;
ans = min(ans, mid);
}
else left = mid + 1;
}
}
cout << ans;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[P3] 백준 13505번 두 수 XOR C++ 트라이, 트리 (0) | 2024.10.22 |
---|---|
[G1] 백준 17435번 합성함수와 쿼리 C++ LCA, 최소 공통 조상, 희소 배열 (1) | 2024.10.22 |
[S1] 백준 14889번 스타트와 링크 C++ 백트래킹, 완전 탐색 (2) | 2024.10.21 |
[G2] 백준 1167번 트리의 지름 C++ 트리, DFS, 깊이 우선 탐색 (0) | 2024.10.21 |
[P2] 백준 15480번 LCA와 쿼리 C++ LCA, 최소 공통 조상, 트리 (1) | 2024.10.20 |