반응형
리뷰
https://www.acmicpc.net/problem/1263
골드 치고는 굉장히 쉬운 그리디 알고리즘 문제
전역 변수
- n : 작업의 개수를 저장할 변수
- Job : 작업을 정의할 구조체, 소요 시간 및 데드라인과 우선순위 큐용 cmp함수를 정의한다.
함수
없음
문제풀이
- n을 입력 받고, Job타입의 우선순위 큐 pq를 초기화 한다.
- n개의 작업의 소요 시작 및 데드라인을 입력 받고 pq에 push해준다.
- si가 최대 100만이니 정수형 변수 now를 100만보다 크게 설정해 준다.
- pq가 빌 때까지 즉, 모든 작업을 처리할 때 까지 루프를 수행한다.
- 만약 pq의 top보다 now가 크다면 pq의 top으로 now를 변경해 준다.
- 정수형 큐 q를 초기화 하고, now보다 크거나 같은 데드라인을 가진 작업을 pq에서 빼내 소요시간을 q로 push해준다.
- q에 있는 요소들을 탐색하며 소요 시간만큼 now의 값을 빼내준다.
- 모든 작업을 처리하고 나서 now가 0이상이라면 now를, 아니라면 -1을 출력해 주면 된다.
참고 사항
데드라인이 큰 순, 소요시간이 작은 순으로 정렬된 우선순위 큐를 사용하면 된다.
만약 모든 작업의 데드라인이 현재 시간보다 작다면 현재 시간을 가장 큰 데드라인으로 줄여주어야 한다.
정답 코드
#include<iostream>
#include<queue>
using namespace std;
int n;
struct Job {
int t, s;
bool operator<(const Job& other) const {
if (s == other.s) return t > other.t;
return s < other.s;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
priority_queue<Job> pq;
for (int i = 0; i < n; ++i) {
int ti, si; cin >> ti >> si;
pq.push({ ti, si });
}
int now = 1000001;
while (!pq.empty()) {
if (!pq.empty() && pq.top().s < now) now = pq.top().s;
queue<int> q;
while (!pq.empty() && pq.top().s >= now) {
q.push(pq.top().t);
pq.pop();
}
while (!q.empty()) {
now -= q.front();
q.pop();
}
}
if (now >= 0) cout << now;
else cout << -1;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G4] 백준 9019번 DSLR C++ BFS (0) | 2024.12.05 |
---|---|
[G4] 백준 1277번 발전소 설치 C++ 다익스트라, 최단 경로 (0) | 2024.12.03 |
[G5] 백준 1092번 배 C++ 큐, 맵, 이진 탐색, 그리디 알고리즘 (0) | 2024.12.01 |
[G5] 백준 16509번 장군 C++ BFS, 시뮬레이션 (0) | 2024.11.29 |
[P3] 백준 13544번 수열과 쿼리 3 C++ 세그먼트 트리, 머지소트 트리 (0) | 2024.11.27 |