for(int i=1; i<=n; i++) {
cnt1 += min(n, mid/i);
cnt2 += min(n, (mid-1)/i);
}
이 코드는 어떻게 구현한건가요??
직접 숫자써가면서 확인해보니까 i*j 보다 작은수를 찾을 수 있겠던데
N * N 배열에서 i*j 보다 작은 수의 갯수를 2중반복문 돌려서 count하니까 시간초과가 나더라구요...
방법을 찾던중에 질문자님의 소스를 보고 분석해봤는데 알맞게 찾아지더라구요. 그런데 원리가 뭔지를 모르겠네요 ㅠ_ㅠ...
원리가 뭔가요??
ldg1291 7년 전
이분탐색으로 풀었습니다.
mid-1 까지의 갯수가 k보다 작고
mid까지의 갯수가 k이상이라면
mid가 답입니다.
라는 아이디어로 했습니다.
cnt1 이 mid까지의 갯수이고
cnt2 가 mid-1까지의 갯수입니다.