백준

백준 1300번(Gold 1)

이야기prog 2025. 3. 10. 21:54

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

이진 탐색을 이용하면 간단하지만 그 떠올리는 과정이 상당히 힘들었었던 문제이다.

#include <iostream>

using namespace std;


int main() {
	cin.tie(0)->sync_with_stdio(false);
	int N; long long K;
	cin >> N >> K;
	//B[k] K보다 작거나 같은 수가 적어도 K개 있다.

	long long start = 1;
	long long end = K;
	long long ans = 0;
	while (start <= end) {
		long long mid = (start + end) / 2;
		long long count = 0;
		for (int i = 1; i <= N; ++i) {
			if ((mid / i) > N) {
				count += N;
			}
			else {
				count += (mid / i);
			}
		}

		if (count < K) {
			start = mid + 1;
		}
		else {
			ans = mid;
			end = mid - 1;
		}
	}

	std::cout << ans << '\n';
	return 0;
}

a[N][N] 을 b[N^2]으로 1차원 배열로 치환하고 그 배열의 값들을 오름차순으로 정렬했을 때, k번쨰 값을 출력해야하는데,

떠올려야 하는 아이디어는 b[k] = T 에서 T보다 작거나 같은 값들이 적어도 k개 있다는거다.

k번째 값이 T일 것이고, k+n값도 T일 수 있다.

또한, k번째 값은 k보다 작거나 같은 값이여야 한다는 것을 알아야한다.

 

 

'백준' 카테고리의 다른 글

백준 1744번(Gold 4)  (0) 2025.03.12
백준 1715번 (Gold 4)  (0) 2025.03.11
백준 2343번 (Silver 1)  (0) 2025.03.10
1167번 (gold 2)  (0) 2025.01.24
2178번 (silver 1)  (0) 2025.01.22