πŸ•οΈ ICPC Sinchon/Greedy

[BOJ][C++] λ°±μ€€ 2109번: μˆœνšŒκ°•μ—° (Gold III)

선달 2025. 2. 11. 02:01
λ°˜μ‘ν˜•

문제

ν•œ μ €λͺ…ν•œ ν•™μžμ—κ²Œ n(0 ≀ n ≀ 10,000)개의 λŒ€ν•™μ—μ„œ κ°•μ—° μš”μ²­μ„ ν•΄ μ™”λ‹€. 각 λŒ€ν•™μ—μ„œλŠ” d(1 ≀ d ≀ 10,000)일 μ•ˆμ— μ™€μ„œ 강연을 ν•΄ μ£Όλ©΄ p(1 ≀ p ≀ 10,000)만큼의 κ°•μ—°λ£Œλ₯Ό μ§€λΆˆν•˜κ² λ‹€κ³  μ•Œλ €μ™”λ‹€. 각 λŒ€ν•™μ—μ„œ μ œμ‹œν•˜λŠ” d와 p값은 μ„œλ‘œ λ‹€λ₯Ό μˆ˜λ„ μžˆλ‹€. 이 ν•™μžλŠ” 이λ₯Ό λ°”νƒ•μœΌλ‘œ, κ°€μž₯ λ§Žμ€ λˆμ„ 벌 수 μžˆλ„λ‘ μˆœνšŒκ°•μ—°μ„ ν•˜λ € ν•œλ‹€. κ°•μ—°μ˜ νŠΉμ„±μƒ, 이 ν•™μžλŠ” ν•˜λ£¨μ— μ΅œλŒ€ ν•œ κ³³μ—μ„œλ§Œ 강연을 ν•  수 μžˆλ‹€.
예λ₯Ό λ“€μ–΄ λ„€ λŒ€ν•™μ—μ„œ μ œμ‹œν•œ p값이 각각 50, 10, 20, 30이고, d값이 μ°¨λ‘€λ‘œ 2, 1, 2, 1 이라고 ν•˜μž. 이럴 λ•Œμ—λŠ” 첫째 날에 4번 λŒ€ν•™μ—μ„œ 강연을 ν•˜κ³ , λ‘˜μ§Έ 날에 1번 λŒ€ν•™μ—μ„œ 강연을 ν•˜λ©΄ 80만큼의 λˆμ„ 벌 수 μžˆλ‹€.

μž…λ ₯

첫째 쀄에 μ •μˆ˜ n이 주어진닀. λ‹€μŒ n개의 μ€„μ—λŠ” 각 λŒ€ν•™μ—μ„œ μ œμ‹œν•œ pκ°’κ³Ό d값이 주어진닀.

좜λ ₯

첫째 쀄에 μ΅œλŒ€λ‘œ 벌 수 μžˆλŠ” λˆμ„ 좜λ ₯ν•œλ‹€.

 

풀이

맨 λ’€ μŠ€μΌ€μ€„λΆ€ν„° μ§ λ‹€κ³  μƒκ°ν•˜λŠ”κ²Œ 포인트

 

νŠΉμ • λ‚ μ§œλ₯Ό κΈ°μ€€μœΌλ‘œ

ν•΄λ‹Ή λ‚ μ§œμ— κ°€λŠ₯ν•œ κ°•μ—° (= ν•΄λ‹Ή λ‚ μ§œ < κ°•μ—° κΈ°ν•œ)λ“€ 쀑

κ°€μž₯ νŽ˜μ΄κ°€ 높은걸 κ·Έ νŠΉμ • λ‚ μ§œμ— λ°°μΉ˜ν•œλ‹€

	    while(idx<n && v[idx].first>=day) {
	        pq.push(v[idx].second);
	        idx++;
	    }

 

ν•΄λ‹Ή λ‚ μ§œμ— κ°€λŠ₯ν•œ λ‚ μ§œμ˜ νŽ˜μ΄λ“€μ„ μš°μ„ μˆœμœ„ 큐에 넣어놓고

	    if(pq.empty()) {
	        continue;
	    }
	    
	    sum += pq.top();
	    pq.pop();

 

κ°€μž₯ νŽ˜μ΄κ°€ 높은걸 (= pq.top()) ν™•μ •μ§€μŒ (= sum+κ°•μ—°λΉ„)

 

그럼 pq에 λ‚¨μ•„μžˆλŠ” λ‹€λ₯Έ 강연듀은 μ „λΆ€
μ§€κΈˆ λ‚ μ§œλ³΄λ‹€ μ•žμͺ½μΈ λ‚ μ§œμ—μ„œ λ‹Ήμ—°νžˆ κ°€λŠ₯ν•œ 강연듀이닀

(μ™œλƒλ©΄ κΈ°ν•œμ΄ κΈ΄ μˆœμ„œλŒ€λ‘œ λ“€μ–΄κ°€κ³ μžˆμœΌλ‹ˆκΉŒ!)

 

κ·Έ λ‹€μŒ(μ•žμͺ½) λ‚ μ§œλ„ κ°€λŠ₯ν•œ κ°•μ—°λ“€μ˜ 페이λ₯Ό μš°μ„ μˆœμœ„νμ— λ„£κ³ 

κ·Έ 쀑 κ°€μž₯ νŽ˜μ΄κ°€ 높은걸 κ·Έ λ‚ μ§œλ‘œ λ°°μΉ˜ν•΄μ„œ μˆ˜κ°•λ£Œ μ±™κΈ°κ³ 

 

λ°˜λ³΅ν•˜λ©΄ 끝

 

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

typedef pair<int, int> ci;

const int INF = 10000;

bool cmp(ci a, ci b) {
    return a.first > b.first;
}

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	int n;
	cin >> n;
	
	vector<ci>v(n);

	for(int i=0; i<n; i++) {
	    int p,d;
	    cin >> p >> d;
	    v[i] = {d,p};
	}
	
	sort(v.begin(), v.end(), cmp);
	
	int sum = 0, idx = 0;
	priority_queue<int> pq;
	
	for(int day=INF; day>0; day--) {
	    while(idx<n && v[idx].first>=day) {
	        pq.push(v[idx].second);
	        idx++;
	    }
	    
	    if(pq.empty()) {
	        continue;
	    }
	    
	    sum += pq.top();
	    pq.pop();
	}
	
	cout << sum;
	
    return 0;
}
λ°˜μ‘ν˜•