-
반응형
8983번: 사냥꾼
KOI 사냥터에는 N 마리의 동물들이 각각 특정한 위치에 살고 있다. 사냥터에 온 사냥꾼은 일직선 상에 위치한 M 개의 사대(총을 쏘는 장소)에서만 사격이 가능하다. 편의상, 일직선을 x-축이라 가
www.acmicpc.net
-풀이-
1. 사대들을 입력받고 정렬을 해준다.
2. 입력받는 동물의 x,y좌표를 입력받은 뒤, 이 동물의 x좌표와 같거나, 같지않다면 x보다 큰 값중 가장 작은 값의 인덱스를 구해준다.(lower_bound)
3. 해당 사대와의 거리를 구해주어 l보다 작다면 cnt를 1 더해준다.
4. 3번이 안되는 경우중, 3번의 인덱스보다 1작은 위치에 있는 사대와도 비교를 해준다.
4번이 왜 그러냐면, lower_bound를 통해 얻은 사대를 b사대라고 하면, (b-1).x<= x <= (b.x) 가 되기때문에, 양 사이드를 모두 비교해 주는 것이다.
-시간 복잡도-
처음 사대를 입력받고, 정렬하는데 O(MlogM)의 시간이 걸린다.
아래 로직을 구하는것은 M에대한 lower_bound를 N번 수행하므로 O(NlogM)이 된다.
M과 N의 최댓값이 똑같으므로 수행시간은 O(NlogN)이 된다.
-코드-
#include<iostream> #include<algorithm> #include<vector> #include<cmath> using namespace std; vector<long long> M; int main() { ios_base::sync_with_stdio(0); cin.tie(0); long long n, m, l, cnt = 0; cin >> m >> n >> l; for (long long i = 0; i < m; i++) { long long data; cin >> data; M.push_back(data); } sort(M.begin(), M.end()); for (long long i = 0; i < n; i++) { long long x, y; cin >> x >> y; long long ind = lower_bound(M.begin(), M.end(), x) - M.begin(); if (abs(M[ind] - x) + y <= l) cnt++; else if (ind - 1 >= 0 && abs(M[ind - 1] - x) + y <= l) cnt++; } cout << cnt; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 14500번 테트로미노 (0) 2021.03.29 [백준OJ] 좌표 압축 (0) 2021.03.28 [백준OJ] 8012번 한동이는 영업사원! (0) 2021.03.24 [백준OJ] 14002번 가장 긴 증가하는 부분 수열 4 , 14003번 가장 긴 증가하는 부분 수열 5 (0) 2021.03.22 [백준OJ] 1939번 중량제한 (0) 2021.03.17 댓글