-
백준 1300 - K번째 수, C++, 이분탐색쾌락없는 책임 (공부)/알고리즘 문제풀이 2021. 9. 21. 13:12반응형
#include <iostream> #include <algorithm> using namespace std; int n, k; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k; int left = 1, right = k, res = -1; while(left <= right){ int mid = (left + right) / 2; int count = 0; for(int i = 1; i <= n; i++) count += min(mid/i, n); if(count < k){ left = mid + 1; } else { right = mid - 1; res = mid; } } cout << res << '\n'; }
주의점 2개만 발견하면 이분탐색으로 풀리는 문제입니다.
- k 번째 수를 B[k]라고 했을 때 B[k] <= k 가 됩니다.
- 각 행에서 mid 보다 작은 수의 마지막을 i*j라 하면 j <= mid / i 가 됩니다.
위 두가지 방법만 잘 쓰면 되는 문제였는데 left += mid = 1이라는 괴상한 문법을 써서 계속 시간초과가 났던 문제였습니다. IDE에서는 왜 된거지..
반응형'쾌락없는 책임 (공부) > 알고리즘 문제풀이' 카테고리의 다른 글
백준 2261 - 가장 가까운 두 점, C++, Closest Pair, 분할정복 (0) 2021.10.30 2261 백준 - 가장 가까운 두 점, Closest Pair 알고리즘, 분할정복 (0) 2021.10.09 백준 1644 - 소수의 연속합, C++, 에라토스테네스의 채, 두 포인터 (0) 2021.09.20 백준 14921 - 용액 합성하기 ,C++ (0) 2021.09.19 13975 백준 - 파일 합치기 3, C++, 우선순위 큐 (0) 2021.09.18