과제
문제
웅찬이는 과제가 많다. 하루에 한 과제를 끝낼 수 있는데, 과제마다 마감일이 있으므로 모든 과제를 끝내지 못할 수도 있다. 과제마다 끝냈을 때 얻을 수 있는 점수가 있는데, 마감일이 지난 과제는 점수를 받을 수 없다.
웅찬이는 가장 점수를 많이 받을 수 있도록 과제를 수행하고 싶다. 웅찬이를 도와 얻을 수 있는 점수의 최댓값을 구하시오.
입력
첫 줄에 정수 N (1 ≤ N ≤ 1,000)이 주어진다.
다음 줄부터 N개의 줄에는 각각 두 정수 d (1 ≤ d ≤ 1,000)와 w (1 ≤ w ≤ 100)가 주어진다. d는 과제 마감일까지 남은 일수를 의미하며, w는 과제의 점수를 의미한다.
출력
얻을 수 있는 점수의 최댓값을 출력한다.
예제 입력
7
4 60
4 40
1 20
2 50
3 30
4 10
6 5
예제 출력
185
풀이
가능한 많은 점수를 받아야 하기 때문에 그리디를 떠올렸다.
우선 순위 큐에 입력 받은 값을 넣어주고 schedule 이라는 배열을 만들어 k번째 날에 진행할 과제가 있는지를 기록했다.
- 우선 순위 큐에 입력 받기 pair<점수, 마감일>
- 큐에서 하나 선택, 큐가 빌 때까지
- 선택한 과제의 schedule[마감일] 이 비어있으면 schedule[마감일]에 진행.
- 그렇지 않으면 마감일에서 하루씩 앞으로 미루면서 가능한 날 탐색
- 2~4번 과정 반복
#include <iostream>
#include <queue>
using namespace std;
priority_queue<pair<int, int>> q; //score deadline
int n;
int schedule[1000];
int findindex(int day){
int index = day;
while(schedule[index] != 0 && index != 0)index--;
return index;
}
long long solve(){
long long sum = 0;
while(!q.empty()){
int score = q.top().first;
int day = q.top().second;
q.pop();
//search index;
int index = schedule[day] == 0 ? day : findindex(day);
if(index == 0)continue;
else{
schedule[index] = 1;
sum += score;
}
}
return sum;
}
void input(){
cin >> n;
int score, day;
for(int i = 0; i < n; i++){
cin >> day >> score;
q.push({score, day});
}
}
int main(){
input();
cout << solve();
}
'알고리듬 > 문제' 카테고리의 다른 글
[baekjoon] 1516 (0) | 2023.05.15 |
---|---|
[baekjoon] 7579 (0) | 2023.05.14 |
[programmers] 코딩 테스트 공부 (1) | 2023.05.10 |
[programmers] 두 큐 합 같게 만들기 (0) | 2023.05.09 |
[programmers] 성격 유형 검사하기 (0) | 2023.05.08 |