#문제
https://www.acmicpc.net/problem/1300
#작성 코드
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>
using namespace std;
long long int n, k;
int main(){
cin>>n>>k;
long long int small = 1;
long long int big = n*n;
long long int x;
long long int answer;
while( small<=big ){
x = (small+big)/2;
long long int numunderX=0; // x이하 수의 개수
for(int i=1; i<=n; i++){
numunderX+=min(x/i, n);
}
if( numunderX>=k ){
// x이하 수의 개수가 k개보다 많으므로 x를 줄여야한다.
big = x-1;
answer = x; // 현재 x를 저장,
// 만약 다음 numunderX가 조건을 만족하지 못하면
// answer는 갱신되지 않는다.
}
else{
// numunderX<k 일 때
// x를 크게 해야 한다.
small = x+1;
}
}
cout<<answer<<'\n';
return 0;
}
|
cs |
##
'x이하 수의 개수가 k개 있다'를 만족하는 x를 찾는 것이 핵심!
가능한 x의 범위 1~n*n 내에서 이분 탐색을 통해 조건을 만족하는 x를 찾는다.
'BOJ' 카테고리의 다른 글
BOJ 6549번 :: 히스토그램에서 가장 큰 직사각형 (0) | 2020.01.04 |
---|---|
BOJ 1021번 :: 회전하는 큐 (0) | 2020.01.03 |
BOJ 2293번 :: 동전 1 (0) | 2020.01.02 |
BOJ 2110번 :: 공유기 설치 (0) | 2019.12.31 |
BOJ 2805번 :: 나무 자르기 (0) | 2019.12.30 |