-
[백준 16401] 과자 나눠주기백준/이분탐색 2023. 9. 12. 20:48
조카에게 줄 수 있는 과자의 최대 길이 이므로 일단 답은 한 개
즉 최대 길이를 쭉 찾다가 딱 최대 길이가 안될때 그 직전의 값이 답이다
그러니까 그 경계를 찾으면 됨.
오랜만에 시간복잡도를 계산해보면
특정 값으로 과자 조각내는거 계산하는데 O(N), 이분탐색 O(logN)이므로 총 O(N)*O(logN).
지수시간이므로 1초안에 가뿐히 통과가능하다.
#include <iostream> #include <stack> #include <vector> #include <algorithm> #define SIZE 1000000 using namespace std; int M, N; vector<int> arr; // O(N) int check(int k) { int ret = 0; for (int i = 0; i < N; i++) { ret += arr[i] / k; } return ret; } // O(logN) int binary_search(int n) { int left = 1; int right = n; int ans = 0; while (left <= right) { int mid = (left + right) / 2; if (check(mid) >= M) { left = mid + 1; ans = mid; }else { right = mid - 1; } } return ans; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int x; cin >> M >> N; for (int i = 0; i < N; i++) { cin >> x; arr.push_back(x); } sort(arr.begin(), arr.end()); cout << binary_search(arr[N - 1]); return 0; }'백준 > 이분탐색' 카테고리의 다른 글
[백준 28357] 사탕 나눠주기 (1) 2024.01.10 [백준 2512] 예산 (0) 2023.07.01 [백준 2805] 나무 자르기 (0) 2023.05.17 [백준 1654] 랜선 자르기 (0) 2023.05.11