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

 

1300번: K번째 수

세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B��

www.acmicpc.net

 

 

책정된 난이도에 비해서 어렵다... 하지만 코드가 짧다. 진짜 아이디어 싸움이다.

 

 

힌트 :

low = 0 , high = n*n+1 를 하고 이것의 mid 값을 기준으로 count 하여 count 값이 k번째 보다 작은지 큰지를 판별하면 된다.

 

 

 

 

더 힌트 : count를 세는 방법을 O(n)으로 알 수 있다. 행렬 특성을 잘 살리면 된다.

각 행별로 count는 mid/X행 이지 않을까?

 

 

 

 

 

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
#include <iostream>
#include <vector>
#include <algorithm>
#define pii pair<intint>
#define ll long long int
using namespace std;
 
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    ll n, k;
    cin >> n >> k;
 
 
    ll low = 1;
    ll high = n * n + 1;
    ll mid;
 
    while (low < high)
    {
        mid = (low + high) / 2;
        ll count = 0;
        for (int i = 1; i <= n; i++)
            count += (ll) min(mid / i, n);
        
        if (count < k)
            low = mid + 1;
        else
            high = mid;
    }
 
    cout << high;
 
}
cs

 

 

 

'뚝배기 터진 문제_boj' 카테고리의 다른 글

boj 9370 미확인 도착지  (0) 2020.07.01
boj 1520 내리막 길  (0) 2020.06.25
boj2293 동전 1  (0) 2020.06.24
boj2261 가장 가까운 두 점  (0) 2020.06.12
boj11401번 이항 계수 3  (0) 2020.06.11

+ Recent posts