#include <iostream>
#include <iostream>
#include <algorithm>
#include <vector>
long long N = 0;
long long k = 0;
long long Low = 0;
long long High = 0;
long long Mid = 0;
long long count = 0;
long long countOrder(long long x)
{
long long sum = 0;
for (int i = 1; i <= N; ++i)
{
sum += std::min(x / i, N);
}
return sum;
}
int main()
{
std::cin >> N >> k;
k = std::min((long long)1000000000, k);
Low = 1;
High = N * N;
while (Low <= High)
{
Mid = (Low + High) / 2;
count = countOrder(Mid);
if (count >= k)
{
High = Mid - 1;
}
else
{
Low = Mid + 1;
}
}
std::cout << Low;
return 0;
}
이분 탐색을 이용해서 푸는 문제
제일 헷갈리는 게 어떤 순서에 따라서 찾을 수 있는가였는데
min(x / i, N)으로 계산할 수 있었다.
모든 행마다 x크기에 i로 나눠서 그게 N보다 크다면 N (열의 갯수 만큼 더하고)
N보다 작다면 x/i가 몇 열까지 크기가 큰가를 정할 수 있습니다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 2629 양팔저울 (0) | 2023.04.20 |
---|---|
[C++] 백준 1520 내리막 (0) | 2023.04.19 |
[C++] 백준 6549 히스토그램에서 가장 큰 직사각형 (1) | 2023.04.17 |
[C++] 백준 10986 나머지 합 (0) | 2023.02.20 |
[C++] 백준 2580 스도쿠 (0) | 2023.02.07 |