알고리즘 문제풀기/인프런 강의 정답
75. 최대 수입 스케쥴(priority queue greedy: 구조체와 Vector를 이용한 정렬)
코다람쥐
2022. 5. 24. 20:34
나의정답1. 최대힙 이용안함.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
struct money {
int m, d;
money(int m, int d) : m(m), d(d) { }
bool operator<(const money& com) const {
if (d != com.d) return d > com.d;
if (m != com.m) return m > com.m;
}
};
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
int n, m, d, res = 0, maxDate = -1, maxMoney = 0, idx;
bool calc;
vector<money> v;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &m, &d);
v.push_back(money(m, d));
if (d > maxDate) maxDate = d;
}
for (int i = maxDate; i >= 1; i--) {
//sort(v.begin(), v.end());
maxMoney = 0;
calc = false;
for (int j = 0; j < n; j++) {
if (v[j].d < i) continue;
calc = true;
if (maxMoney <= v[j].m) {
maxMoney = v[j].m;
idx = j;
}
}
if (calc) {
v[idx].d = -1;
res += v[idx].m;
}
}
printf("%d", res);
return 0;
}
나의정답2. 최대힙 이용
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
struct money {
int m, d;
money(int m, int d) : m(m), d(d) { }
bool operator<(const money& com) const {
if (d != com.d) return d > com.d;
if (m != com.m) return m > com.m;
}
};
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
int n, m, d, res = 0, maxDate = -1;
priority_queue<int> pq;
vector<money> v;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &m, &d);
v.push_back(money(m, d));
if (d > maxDate) maxDate = d;
}
for (int i = maxDate; i >= 1; i--) {
for (int j = 0; j < n; j++) {
if (v[j].d == i) {
pq.push(v[j].m);
}
}
if (!pq.empty()) {
res += pq.top();
pq.pop();
}
}
printf("%d", res);
return 0;
}