백준 9878번, Bessie Slows Down 풀이
2021. 2. 22. 20:13ㆍProblem Solving/백준
문제
풀이
이벤트 T와 D를 순서대로 처리해야 합니다.
이벤트 T와 D 각각에서는 작은 것부터 차례로 봐주면 되지만, T와 D 원소 각각에 대해서는 대소 관계를 정의하기는 어렵습니다.
하지만, 매번 T와 D 중에 가장 작은 원소끼리만 비교하여 현재 순간에서 이벤트 T가 먼저 오는지, D가 먼저 오는지 판별하여 처리해주는 것은 쉽습니다.
위 작업을 하기 위해서, 현재 시간과 현재 위치를 저장해두며 문제에서 시킨대로 하면 됩니다.
작은 것부터 봐주는 과정은 우선순위 큐, 나머지는 구현입니다.
소스코드
#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<ld> vld;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<pld> vpld;
typedef unordered_map<int, int> mpii;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n; cin >> n;
priority_queue<ld, vld, greater<>> T, D;
while (n--) {
char c; ld a;
cin >> c >> a;
if (c == 'T') T.push(a);
else D.push(a);
}
ld curr_speed = 1, pos = 0, ans = 0;
while (!T.empty() || !D.empty()) {
if (T.empty()) {
auto d = D.top(); D.pop();
ans += (d - pos) * curr_speed;
pos = d;
} else if (D.empty()) {
auto t = T.top(); T.pop();
pos += (t - ans) * (1 / curr_speed);
ans = t;
} else {
auto d = D.top();
auto t = T.top();
if (ans + (d - pos) * curr_speed <= t) { //이벤트 D가 앞서는 경우
ans += (d - pos) * curr_speed;
pos = d;
D.pop();
} else { //이벤트 T가 앞서는 경우
pos += (t - ans) * (1 / curr_speed);
ans = t;
T.pop();
}
}
++curr_speed;
}
ans += (1000 - pos) * curr_speed;
cout << (ll)round(ans);
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 15487번, A[j]-A[i]+A[l]-A[k] 풀이 (0) | 2021.03.12 |
---|---|
백준 2904번, 수학은 너무 쉬워 풀이 (0) | 2021.02.25 |
백준 14256번, SSR 풀이 (0) | 2021.02.19 |
백준 16940번, BFS 스페셜 저지 풀이 (0) | 2021.02.18 |
백준 2201번, 이친수 찾기 풀이 (0) | 2021.02.05 |