PS

[백준] 2109번 순회 강연 (C++)

-minari- 2024. 9. 25. 21:17

 

https://www.acmicpc.net/problem/2109

 

문제 설명

대학에서 p만큼의 강연료를 지불할테니 d일 이내에 와서 강연을 해달라는 조건이다.
최대한 많은 돈을 벌 수 있게끔 구하는 문제이다. 

 

주요 로직

1. 강연료를 기준으로 방문할 대학을 고른다.
-> sort() 함수를 이용해 강연료를 내림차순으로 정렬한다. 

 

정답 코드

#include <bits/stdc++.h>

using namespace std;

int n,d,p,ret;
bool arr[10004];
vector<pair<int,int>> v;

bool cmp(pair<int,int> a, pair<int,int> b){
	return a.first > b.first;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> p >> d;
		v.push_back({p,d}); // d일, p값 
	}
	
	sort(v.begin(), v.end(), cmp);

	for(int i=0; i<n; i++){
		if(arr[v[i].second] == false){
			arr[v[i].second] = true;
			ret += v[i].first;
		}
		else{
			for(int j=v[i].second-1; j>0; j--){
				if(arr[j] == false){
					arr[j] = true;
					ret += v[i].first;
					break;
				}
			}
		}
		
	}
	
	cout << ret << "\n";

}