728x90
0. [c++] 백준 - |
https://www.acmicpc.net/problem/1654
1. 풀이 |
랜선 자르기 크... 군대 생각나네.
그 기억을 살려서 문제를 열심히 풀어보자.
우선 이 문제는 K개의 랜선(arr[K])을 N개의 랜선으로 만드는 것이 목표인데, 이때, 최대로 할 수 있는 길이가 얼마인지 구하는 문제이다.
간단하게 생각하여서 길이(=length)를 1씩 증가시키며 arr[i] / length 의 합이 N이 넘는지 확인을 하면 문제를 풀 수는 있다.
허나, 이러한 방법을 택하게 된다면, 시간 제한에 걸리게 될 것이다.
따라서 최대 길이를 구하는 그 기간을 짧게 만들어야 할 것이다.
뭐, 다양한 방법이 있겠지만, 나의 경우에는 최소 길이(=1)과 임의의 최대 길이(arr[K]의 총 합 / N)을 미리 구하고, 이 길이를 이진 탐색을 통해 좀더 정밀하게 나누어서 실제로 가능한 최대 길이를 구하는 방식으로 설계하였다.
2. 소스코드 |
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 | #include<iostream> #include<algorithm> typedef unsigned long long ull; using namespace std; ull Arr[10001]; ull binarySearch(const int & K, const int & N) { ull first = 1; ull last = 0; ull ret = 0; for (int i = 0; i < K; i++) { last += Arr[i]; } last /= N; ull mid = 1; while (first <= last) { mid = (first + last) / 2; ull temp = 0; for (int i = 0; i < K; i++) { temp += Arr[i] / mid; } //cout << mid << endl; if (temp >= N) { ret = max(ret, mid); first = mid + 1; } else last = mid - 1; } return ret; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int K, N; cin >> K >> N; for (int i = 0; i < K; i++) { cin >> Arr[i]; } sort(Arr, Arr + K); cout << binarySearch(K, N); } | cs |
3. 참고 |
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!
'<백준> > |c++| normal' 카테고리의 다른 글
[c++] 백준 2957 - 이진 탐색 트리(map활용, 이후에 다시) (0) | 2019.07.05 |
---|---|
[c++] 백준 1300 - K번째 수(이진 탐색) (0) | 2019.07.04 |
[c++] 백준 2473 - 세 용액 (0) | 2019.07.02 |
[c++] 백준 2312 - 수 복원하기(소인수분해, 소수, 에라토스테네스의 체) (0) | 2019.06.12 |
[c++] 백준 11729 - 하노이 탑 이동 순서(재귀 호출) (0) | 2019.06.12 |