반응형
https://www.acmicpc.net/problem/13904
13904번: 과제
예제에서 다섯 번째, 네 번째, 두 번째, 첫 번째, 일곱 번째 과제 순으로 수행하고, 세 번째, 여섯 번째 과제를 포기하면 185점을 얻을 수 있다.
www.acmicpc.net
1.문제설명
문제의 점수를 기준으로 정렬합니다.
그리고 점수가 제일 큰 것부터 보면서
해당 과제를 처리할 수 있는 날 중 최대한 늦은 날을 찾아 이 과제를 하는 날로 정합니다.
예를 들어 과제가 4일 까지라면
4일, 3일, 2일, 1일을 보면서 이미 해당 날짜가 차지되어 있는지 확인하고
모두 이미 차지되었다면 이 과제를 할 수 없는 것입니다.
문제 풀이는 우선순위 큐를 이용해도 되고
벡터 정렬을 이용해도 됩니다.
2.문제풀이코드 C++
1.벡터정렬
#include <bits/stdc++.h>
using namespace std;
int n;
bool ch[1001];
struct Hw {
int day, point;
bool operator<(const Hw& b) const {
return point > b.point;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
vector<Hw> v;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
v.push_back({ a,b });
}
sort(v.begin(), v.end());
int ans = 0;
for (int i = 0; i <v.size(); i++) {
int day = v[i].day;
int point = v[i].point;
while (ch[day] && day>=1) {
day--;
}
if (day == 0) continue;
ch[day] = 1;
ans += point;
}
cout << ans << '\n';
return 0;
}
2. 우선순위 큐 활용
#include <bits/stdc++.h>
using namespace std;
int n;
bool ch[1001];
struct Hw {
int day, point;
bool operator<(const Hw& b) const {
return point < b.point;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
priority_queue<Hw> Q;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
Q.push({ a,b });
}
int ans = 0;
while (!Q.empty()) {
int day = Q.top().day;
int point = Q.top().point;
Q.pop();
while (ch[day] && day>=1) {
day--;
}
if (day == 0) continue;
ch[day] = 1;
ans += point;
}
cout << ans << '\n';
return 0;
}

우선순위큐를 이용해서 삽입할 때마다 바로 정렬을 해주거나
벡터를 이용해서 최종적으로 정렬을 해주거나
문제를 푸는데는 큰 차이가 없어보입니다.
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 11660번 : 구간 합 구하기 5 - 누적합 C++ (0) | 2022.03.09 |
---|---|
백준 1493번 : 박스 채우기 - 그리디 , 분할정복 C++ (0) | 2022.03.08 |
백준 2212번: 센서 - 그리디 C++ (0) | 2022.03.07 |
백준 1700번 : 멀티탭 스케줄링 - 그리디 C++ (0) | 2022.03.07 |
백준 11000번 : 강의실 배정 - 우선순위 큐 C++ (0) | 2022.03.07 |