※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26939번 문제인 Biblioteket이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26939
26939번: Biblioteket
På första raden står två heltal: antalet böcker som ska ställas tillbaka $N$, där $1 \le N \le 100$, och antalet böcker du kan bära samtidigt $K$, där $1 \le K \le 100$. Sedan följer $N$ rader med ett heltal på varje rad, x-koordinaten för den
www.acmicpc.net
가장 멀리 꽂아야하는 책 또한 결국 그 위치에 책을 꽂으러 이동해야 하므로, 그 곳으로 책을 꽂으러 갈 때 그 방향으로 꽂아야하는 가장 멀리 있는 책 (최대) K개를 가져갔다가 0으로 돌아오는 그리디 전략으로 책을 채워 문제를 해결하자.
위와 같은 왕복이동의 순서는 바꿔도 무방하므로, 위 과정에서 필요한 가장 먼 왕복거리를 마지막 편도이동으로 잡자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, K;
vector<int> vec1, vec2;
int ans, mx;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
while (N--) {
int x; cin >> x;
if (x > 0) vec1.emplace_back(x);
else vec2.emplace_back(-x);
}
sort(vec1.begin(), vec1.end());
sort(vec2.begin(), vec2.end());
ans = vec1.back() * 2 + vec2.back() * 2;
mx = max(vec1.back(), vec2.back());
while (vec1.size() > K) {
for (int k = 0; k < K; k++) vec1.pop_back();
ans += vec1.back() * 2;
}
while (vec2.size() > K) {
for (int k = 0; k < K; k++) vec2.pop_back();
ans += vec2.back() * 2;
}
ans -= mx;
cout << ans;
}
'BOJ' 카테고리의 다른 글
[BOJ 26938 // C++] Lamps (0) | 2022.12.30 |
---|---|
[BOJ 1622 // C++] 공통 순열 (0) | 2022.12.30 |
[BOJ 26940 // C++] Chokladkartongen (0) | 2022.12.30 |
[BOJ 13703 // C++] 물벼룩의 생존확률 (0) | 2022.12.29 |
[BOJ 1380 // C++] 귀걸이 (0) | 2022.12.29 |