기술 블로그

1300번 K번째 수 본문

알고리즘 문제/BOJ

1300번 K번째 수

parkit 2019. 12. 17. 18:04
728x90
반응형

https://www.acmicpc.net/problem/1300







https://www.acmicpc.net/board/view/31679#comment-57064


https://www.acmicpc.net/board/view/37110





단순한 이분탐색인줄 알았는데 전혀 아니었다.


나는 A[i][j] = i*j를 어떻게 구할까를 생각했었다. 


이유는 100,000 * 100,000이었기 때문이었다.


하지만 위의 2개 링크를 통해 또 다른 큰 생각하지도 못 했던 부분을 발견했었다.


2개의 링크를 꼭 참고하자.




모든 k에 대해 배열에 있는 수 중 k번째로 작은 수가 k 이하라는 뜻이며, 

이는 모든 k에 대해 배열에 k 이하인 수가 k개 이상 존재한다는 것과 동치




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
#include <bits/stdc++.h>
 
using namespace std;
 
int n, k;
 
int bs()
{
    int Left = 1, Right = k, ret = 0;
 
    while (Left <= Right)
    {
        int mid = (Left + Right) / 2, cnt = 0;
        for (int i = 1; i <= n; i++) {
            cnt += min(mid / i, n); // j의 개수
        }
        if (cnt < k) {
            Left = mid + 1;
        }
        else {
            ret = mid; // 구하고자 하는 것은 mid
            Right = mid - 1;
        }
    }
 
    return ret;
}
 
int main()
{
    //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin);
    cin.tie(0);
    scanf("%d %d"&n, &k);
    printf("%d\n", bs());
    return 0;
}
cs

















728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

1138번 한 줄로 서기  (0) 2019.12.21
2631번 줄세우기  (0) 2019.12.17
1699번 제곱수의 합  (0) 2019.12.13
2931번 가스관  (0) 2019.11.16
17780번 새로운 게임  (0) 2019.11.13