www.acmicpc.net/problem/8983

 

8983번: 사냥꾼

입력의 첫 줄에는 사대의 수 M (1 ≤ M ≤ 100,000), 동물의 수 N (1 ≤ N ≤ 100,000), 사정거리 L (1 ≤ L ≤ 1,000,000,000)이 빈칸을 사이에 두고 주어진다. 두 번째 줄에는 사대의 위치를 나타내는 M개의 x-좌

www.acmicpc.net

 

 

[난이도] Gold4

[유형] 소팅,이분탐색

 

[풀이]

1. 사대와 동물을 x좌표 기준으로 오름차순으로 정렬
2. 모든 사대를 순회하면서 동물들을 잡을 수 있는지 체크한다. 동물과
   사대의 x좌표 차이의 절댓값이 다음 사대의 x좌표 절댓값보다 크면 다음
   사대로 넘어간다. (x좌표 절대값이 적은 사대가 가장 유리하기 때문)

 

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int M,N,L,p[100000],ans;
pair<int,int> ani[100000];
int main(){
    scanf("%d%d%d",&M,&N,&L);
    for(int i=0;i<M;i++) scanf("%d",&p[i]);
    for(int i=0;i<N;i++) scanf("%d%d",&ani[i].first,&ani[i].second);
    sort(p,p+M);
    sort(ani,ani+N);
    int j=0;
    for(int i=0;i<M;i++){
        for(;j<N;j++){
            if(i<M-1&& abs(ani[j].first-p[i]) > abs(ani[j].first-p[i+1])) break;
            if(abs(ani[j].first-p[i])+ani[j].second <= L) ans++;
        }
    }
    printf("%d",ans);
}

github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/8983.cpp

 

+ Recent posts