전화감지기가 $N$개, 일열로 된 집이 $M$개 있다.
전화감지기가 $P_{i}$와 $P_{i + 1}$의 중간에 위치할 때 동쪽과 서쪽에서 통화한것을 감지할 수 있다.
전화감지기의 위치와 해당 통화량이 주어질 때 하루동안 감지된 최소한의 통화량을 구하는 문제다.
다음과 같은 예를 들어보자. ('/'는 감지기의 위치)
$N = 3, M = 5$
1 / 2 3 4 5 : 1통화
1 2 / 3 4 5 : 2통화
1 2 3 / 4 5 : 2통화
첫번째를 보면 1번집과 2,3,4,5번 집 사이의 통화가 한번은 존재한다.
두 번째에서 2통화가 되었는데 이것은 2번집과 3,4,5번 집 사이에 한통화가 존재한다는 뜻이다.
(1번집과 2,3,4,5번 집 사이의 통화가 한번 있었기 때문)
세 번째에서도 여전히 2통화인데 이를 통해서 얻을 수 있는 확실한 정보는 없게된다.
따라서 주어진 입력을 감지기 위치 순으로 오름차순 정렬 후 증가하는 것에대해 누적합하면 된다.
| 
#include <cstdio> 
#include <algorithm> 
using namespace std; 
int N, M; 
pair<int, int> call[100001]; 
int main() { 
    scanf("%d%d", &N, &M); 
    for (int n = 0;n < N;n++) { 
        scanf("%d%d", &call[n].first, &call[n].second); 
    } 
    sort(call, call + N); 
    long long ans = 0; 
    long long prev = 0; 
    for (int n = 0;n < N;n++) { 
        if (prev < call[n].second) { 
            ans += (long long)(call[n].second - prev); 
        } 
        prev = call[n].second; 
    } 
    printf("%lld\n", ans); 
    return 0; 
} | cs | 
이런 추상적인 문제 참 좋은 문제인것 같다.
 
댓글 없음:
댓글 쓰기