반응형
문제 출처 :
https://www.acmicpc.net/problem/1654
알고리즘 분석 :
문제 해결에 필요한 사항
1. 정렬
2. 이분 탐색(Binary Search)
나무 자르기 문제와 매우 유사하다. http://www.crocus.co.kr/522
랜선을 모두 정렬 한 후, 그에 따른 이분 탐색을 통해 cnt가 k보다 크거나 같은 값들을
모두 save 배열에 저장 한 뒤, 마지막에 save를 정렬하여 가장 큰 값을 출력하도록 하면 된다.
소스 코드 :
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 52 53 54 55 56 57 58 | #include <iostream> #include <algorithm> #include <cstdio> using namespace std; long long int lan[1000001]; long long int save[1000001]; int s; void binarySearch(long long int start, long long int end, int n, int k) { long long int mid, cnt; while (start <= end) { cnt = 0; // 원하는 개수 보다 cnt가 크거나 같을 경우 // save 배열에 mid값을 저장한다. // 모든 탐색을 끝내고 save 배열을 정렬하여 가장 큰 값을 출력시킨다. mid = (start + end) / 2; for (int i = 0; i < n; i++) cnt += lan[i] / mid; if (cnt >= k) { save[s++] = mid; start = mid + 1; } else end = mid - 1; } } int main() { int n, k, res; cin >> n >> k; for (int i = 0; i < n; i++) cin >> lan[i]; sort(lan, lan + n); binarySearch(0, lan[n - 1], n, k); sort(save, save + s); cout << save[s - 1]; return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[11057번] 오르막 수 (0) | 2017.01.31 |
---|---|
[1309번] 동물원 (0) | 2017.01.31 |
[1978번] 소수 찾기 (0) | 2017.01.13 |
[1181번] 단어 정렬 (0) | 2017.01.09 |
[1427번] 소트인사이드 (0) | 2017.01.09 |