반응형
문제
https://www.acmicpc.net/problem/2212
풀이
K개의 집중국을 K개의 직선으로 바꿔서 생각하면 쉽게 해결이 가능한 문제이다. 수신 가능영역 거리의 최소는 센서 사이 직선의 최소 길이로 바꿔 생각하면 된다.
N개의 센서들을 정렬하고 인접한 센서 사이의 거리를 구하고 다시 정렬하여 큰 거부터 K - 1개 제거해주면 된다. 예제
1 6 9 3 6 7의 경우 1 3 6 6 7 9로 정렬이 되고 인접한 거리는 다시 2 3 0 1 2가 된다. 여기서 가장 길이가 긴 직선인 3을 제거하면, 두개의 기지국 중에서 한 개의 기지국은 2만큼 수신하고 나머지 한 개의 기지국 0+1+2 만큼 수신하면 된다. 따라서 길이가 가장 긴 거리부터 삭제하면 최소의 거리를 구할 수 있다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <iostream> #include <algorithm> using namespace std; int sensor[10000]; int dist[999]; int result; int main() { cin.tie(0); ios::sync_with_stdio(false); int N, K; cin >> N >> K; for (int i = 0; i < N; i++) cin >> sensor[i]; sort(sensor, sensor + N); // 인접한 센서 사이의 거리 for (int i = 0; i < N - 1; i++) dist[i] = sensor[i + 1] - sensor[i]; // 거리 내림차순 정렬 sort(dist, dist + (N - 1), greater<int>()); // 거리가 먼 순서대로 삭제 for (int i = 0; i < K - 1; i++) dist[i] = 0; for (int i = 0; i < N - 1; i++) result += dist[i]; cout << result; return 0; } | cs |
반응형
'BOJ' 카테고리의 다른 글
백준 2309 - 일곱 난쟁이 (0) | 2019.07.03 |
---|---|
백준 13904 - 과제 (1) | 2019.07.02 |
백준 1182 - 부분수열의 합 (0) | 2019.06.29 |
백준 1699 - 제곱수의 합 (0) | 2019.06.25 |
백준 2294 - 동전 2 (0) | 2019.06.24 |