티스토리 뷰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <iostream> #include <vector> #include <algorithm> using namespace std; bool check(vector<int> v, int dist, int c){ int cnt = 1; // 맨 첫번째에 놓여있는 공유기 int last = v[0] + dist; // 첫번째 다음에 놓일 공유기 for(int i = 0; i < v.size(); i++){ if(v[i] >= last){ // 최소 거리보다 멀리 있는 집인 경우 cnt++; // 공유기 1대 설치 last = v[i] + dist; // 다음에 놓일 공유기 위치 } } // 현재 공유기 개수(cnt)가 c보다 같거나 클 경우, 최소 거리를 늘릴 수 있고 -> true 리턴 // 현재 공유기 개수가 c보다 작을 경우, 최소 거리를 줄여야 함 -> false 리턴 return cnt >= c; } int main() { int n, c; cin >> n >> c; // 집 정보 입력 vector<int> v; v.resize(n); for(int i = 0; i < n; i++){ cin >> v[i]; } sort(v.begin(), v.end()); // 집 정보 정렬 // 공유기 간 최소 거리를 구하기 위한 binary search 실행 int start = 1; // 가장 적은 공유기간 거리 int end = v[n-1] - v[0]; // 가장 큰 공유기간 거리 int ans = 1; while(start <= end){ int mid = (start + end) / 2; if(check(v, mid, c)){ // 공유기가 c보다 같거나 적게 는 경우 ans = max(mid, ans); start = mid + 1; }else{ // 공유기가 c보다 많이 드는 경우 end = mid - 1; } } cout << ans << endl; } | cs |
'알고리즘' 카테고리의 다른 글
[C++/BFS] BOJ 2206 벽 부수고 이동하기 (0) | 2020.02.17 |
---|---|
[C++/LIS] 백준 2565 전깃줄 (0) | 2020.01.26 |
[C++] 백준 11054 가장 긴 바이토닉 부분수열 (0) | 2020.01.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 2981
- 블루투스
- BFS
- 아두이노
- 리눅스
- 백준
- c++
- ESP8266
- 11503
- dovecot
- 메일서버
- git
- 스티커모으기2
- java
- 프로그래머스
- DP
- FTP
- 구슬 탈출2
- hc-06
- 키 순서
- dht11
- 라즈비안
- 집배원 한상덕
- 워드프레스
- 라즈베리파이
- mysql
- hackerrank
- 합승 택시 요금
- 자바
- the pads
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함