1920번: 수 찾기
이분 탐색을 이용하면 된다. 나는 속도가 60ms가 나왔는데 적게 나오신 분들의 코드를 보니 입력 받는 부분이 특이하던데 어떻게 하는지는 모르겠다.
이분탐색에서 int mid = (left + right) / 2하는 부분에서 / 2 부분을 쉬프트 연산자를 써서 >> 1로 바꿔주니 나의 경우에는 64ms -> 60ms로 바뀌었다.
코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <algorithm> | |
using namespace std; | |
int N, M, A[100001], B[100001]; | |
inline bool bs(int left, int right, int n) | |
{ | |
while (left <= right) | |
{ | |
int mid = (left + right) >> 1; | |
if (A[mid] < n) | |
left = mid + 1; | |
else if (A[mid] > n) | |
right = mid - 1; | |
else { | |
return true; | |
break; | |
} | |
} | |
return false; | |
} | |
int main() | |
{ | |
scanf("%d", &N); | |
for (int i = 0; i < N; i++) | |
{ | |
scanf("%d", &A[i]); | |
} | |
scanf("%d", &M); | |
for (int i = 0; i < M; i++) | |
{ | |
scanf("%d", &B[i]); | |
} | |
sort(A, A + N); | |
const int end = N - 1; | |
for (int i = 0; i < M; i++) { | |
if (bs(0, end, B[i])) | |
printf("1\n"); | |
else | |
printf("0\n"); | |
} | |
return 0; | |
} |
'온라인저지' 카테고리의 다른 글
[BOJ] 1316번: 그룹 단어 체커 (0) | 2018.03.10 |
---|---|
[BOJ]1005: ACM Craft (0) | 2018.03.09 |
[BOJ]1004번: 어린 왕자 (0) | 2018.02.19 |
[BOJ]2606번: 바이러스 (0) | 2018.02.05 |
[BOJ] 1932번: 숫자삼각형 (0) | 2018.02.03 |
[BOJ]1978번: 소수 찾기 (0) | 2018.02.02 |