728x90
N개의 고속도로 위에 K개의 집중국을 세웠을 때 집중국의
수신 가능 영역의 길이의 최소값을 출력하는 문제입니다.
이는 N을 정렬한 뒤 K개의 묶음으로 나눠서
묶음 내에서의 최대값 - 최소값의 총 합을 구하면 됩니다.
위의 예제의 경우 정렬을 하면 다음으로 나타낼 수 있습니다.
1 3 6 6 7 9
여기서 각 거리의 차이를 구해줍니다.
2 3 0 1 2
길이의 최소값을 구해야하므로 가장 긴 거리를 지워줘야 합니다.
집중국의 개수 K - 1개 만큼 가장 긴 길이를 지울 수 있다고 보면 됩니다.
K = 2이므로 1개를 지울 수 있다고 생각했을때 가장 큰 3을 지워줍니다.
그리고 나머지 거리들을 전부 더해주면 수신 가능 영역의 길이의 총 합을 구할 수 있습니다.
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int main(int argc, char* argv[])
{
int n, k;
int num;
int s, e;
int result = 0;
vector<int> v;
vector<int> temp;
priority_queue<pair<int, int> > pq;
cin >> n >> k;
for (int i = 0; i < n; ++i) {
cin >> num;
v.push_back(num);
}
sort(v.begin(), v.end());
for (int i = 1; i < n; ++i) {
pq.push({ -(v[i] - v[i - 1]), i });
}
while (pq.size() >= k) {
pq.pop();
}
while (!pq.empty()) {
temp.push_back(-(pq.top().second));
pq.pop();
}
sort(temp.begin(), temp.end());
temp.push_back(-(n));
s = 0;
for (int i = 0; i < temp.size(); ++i) {
e = -temp[i] - 1;
result += v[e] - v[s];
s = -temp[i];
}
cout << result << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 15988번 1, 2, 3 더하기 3 (0) | 2019.11.26 |
---|---|
[C++] 백준 8980번 택배 (0) | 2019.11.24 |
[C++] 백준 12845번 모두의 마블 (0) | 2019.11.24 |
[C++] 백준 1449번 수리공 항승 (0) | 2019.11.23 |
[C++] 백준 1969번 DNA (0) | 2019.11.23 |