어흥

[백준 8983] 사냥꾼 (C++) 본문

알고리즘/백준

[백준 8983] 사냥꾼 (C++)

라이언납시오 2021. 2. 23. 16:20
728x90
반응형

문제 링크: www.acmicpc.net/problem/8983

 

8983번: 사냥꾼

KOI 사냥터에는 N 마리의 동물들이 각각 특정한 위치에 살고 있다. 사냥터에 온 사냥꾼은 일직선 상에 위치한 M 개의 사대(총을 쏘는 장소)에서만 사격이 가능하다. 편의상, 일직선을 x-축이라 가

www.acmicpc.net

1. 주의할 점

- 모두 비교할 경우, 최악의 경우 O(N*M)으로 TLE가 발생한다

- 둘중 하나는 lgN이나 lgM으로 바꿔야 TLE가 발생하지 않는다

- 사대의 X값이 정렬되어 있지 않다. 왜?

 

2. 구현

- 입력 받은 사대 Arr[]를 오름차순으로 정렬한다

- 동물들의 위치를 X[], Y[]에 할당 받는다

- 각 동물을 기점으로 사대까지의 거리가 Len보다 작거나 같다면, Result++하고 다음 동물로 넘어간다

- 만약 거리가 Len보다 크다면, 동물기준으로 사대가 우측이면(사대x > 동물x) R = Mid-1로 설정하여 더 왼쪽에 위치한 사대에서 다시 검사할 수 있도록 한다. 반대로, 동물기준으로 사대가 좌측이면(사대x < 동물x) L = Mid+1로 설정하여 더 오른쪽에 위한 사대에서 다시 검사한다

 

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int x[100001];
int y[100001];
int arr[100000];
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int num,animal,len;
    cin>>num>>animal>>len;
    for(int i=0;i<num;i++)
        cin>>arr[i];
    sort(arr,arr+num);
    for(int i=0;i<animal;i++)
        cin>>x[i]>>y[i];
    int result=0;
    for(int k=0;k<animal;k++){
        int l=0,r=num-1,mid;
        while(l<=r){
            mid = l + (r-l)/2;
            int cal = abs(arr[mid]-x[k])+y[k];
            if(cal<=len){
                result++;
                break;
            }
            else{
                if(x[k] >= arr[mid])
                    l = mid+1;
                else r = mid-1;
            }
        }
    }
    cout << result;
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2473] 세 용액 (C++)  (0) 2021.02.24
[백준 1365] 꼬인 전깃줄 (C++)  (0) 2021.02.24
[백준 2352] 반도체 설계 (C++)  (0) 2021.02.23
[백준 19238] 스타트 택시 (C++)  (0) 2021.02.23
[백준 2812] 크게 만들기 (C++)  (0) 2021.02.19
Comments