※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26944번 문제인 Uppställning이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26944
키가 가장 큰 아이 i명만을 남겼을 때의 배치의 순서를 알고 있다면 i+1번째로 키가 큰 아이의 왼쪽에 자신보다 키가 큰 사람이 몇 명 있는지를 이용해 키가 가장 큰 i+1명만을 남겼을 때의 배치의 순서를 구할 수 있다.
위의 관찰을 이용해 키가 가장 큰 아이부터 한명씩 배치해나가면서 문제를 해결하자. 아이의 수가 충분히 작으므로 벡터의 insert 등을 이용해 구현해도 문제를 충분히 해결할 수 있다.
별해로, 아이들이 줄을 서는 모든 순열의 경우의 수를 살펴 문제의 답을 구하는 방법 또한 존재한다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int N;
priority_queue<pair<pair<int, char>, int>> pq;
vector<char> ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++) {
int L, R; cin >> L >> R;
pq.push(make_pair(make_pair(-(L + R), 'A' + i), L));
}
while (!pq.empty()) {
auto p = pq.top(); pq.pop();
ans.insert(ans.begin() + p.second, p.first.second);
}
for (auto& c : ans) cout << c;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 24184 // C++] Arabiska (0) | 2023.01.11 |
---|---|
[BOJ 26948 // C++] Plankan (0) | 2023.01.11 |
[BOJ 26942 // C++] Gruppindelning (1) | 2023.01.11 |
[BOJ 6600 // C++] 원의 둘레 (0) | 2023.01.10 |
[BOJ 25558 // C++] 내비게이션 (0) | 2023.01.10 |