[๋ฌธ์ ]
https://www.acmicpc.net/problem/2109
d(1 ≤ d ≤ 10,000)์ผ ์์ ์์ ๊ฐ์ฐ์ ํด ์ฃผ๋ฉด p(1 ≤ p ≤ 10,000)๋งํผ์ ๊ฐ์ฐ๋ฃ๋ฅผ ์ง๋ถํ๋ค.
์ฒซ์งธ ์ค์ ์ ์ n์ด ์ฃผ์ด์ง๋ค. ๋ค์ n๊ฐ์ ์ค์๋ ๊ฐ ๋ํ์์ ์ ์ํ p๊ฐ๊ณผ d๊ฐ์ด ์ฃผ์ด์ง๋ค.
๊ฐ์ฅ ๋ง์ ๋์ ๋ฒ ์ ์๋ ์ํ๊ฐ์ฐ์ ์ฐพ๊ณ ๊ทธ ๋์ ์ถ๋ ฅํ๋ผ.
[ํ์ด]
d ์ผ ์์ ์์ ๊ฐ์ฐ์ด๋ผ๋ ์กฐ๊ฑด์ d ์ผ์ ๊ฐ์ฐํ๋ ๊ฑธ๋ก ์๋ชป ์ดํดํ์ฌ map ์ผ๋ก ํ๋ค๊ฐ ํ๋ ธ๋ค.
๊ฒ์ํ์ ์ฐธ๊ณ ํด๋ณด๋ d ์ผ ์์ ์์ ๋ผ๋ ์กฐ๊ฑด์ด ์๊ธฐ์ d ์ผ ์์ด๋ฉด ์ธ์ ๋ ๊ฐ์ฐํ ์ ์๋ค๋ ๊ฒ์ ์๊ฐํด์ผ ํ๋ค.
n๊ฐ์ ๋ํ์ ์ ๋ถ๋ฅผ ๋น๊ตํ๊ธฐ์๋ ์๊ฐ์ ํ์ด ๋๋ฏ๋ก sort, priority queue ๋ฅผ ์ด์ฉํ Greedy ๋ก ์ ๊ทผํด์ผ ํ๋ค.
๊ธฐํ์ ๊ธฐ์ค์ผ๋ก ํ ๊ฑด์ง ๊ฐ์ฐ๋ฃ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ๊ฑด์ง ์ ๋ ฌ ๊ธฐ์ค์ ์ธ์์ผ ํ๋ค.
์์ผ๋ก ๊ทธ๋ ค๊ฐ๋ฉฐ ๊ธฐํ ์ค๋ฆ์ฐจ์/๋ด๋ฆผ์ฐจ์, ๊ฐ์ฐ๋ฃ ์ค๋ฆ์ฐจ์/๋ด๋ฆผ์ฐจ์ ์ ํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์์ ๋,
๊ธฐํ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ณ , ์ค๋ฆ์ฐจ์ priority_queue๋ก queue ์ ํฌ๊ธฐ > ๋น์ฉ๊ณผ ๋น๊ตํ๋ฉฐ ์ต์๊ฐ์ ์ ๊ฑฐํ๊ณ ์ต๋๊ฐ๋ง ๋จ๊ธฐ๋ฉด ํ๋ฆฐ๋ค.
[ํ์ด ์์]
5
3 3
2 3
1 3
100 4
90 4
1) ๋จผ์ ์ผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ธฐ
d p
3 1
3 2
3 3
4 90
4 100
2) priority queue ์ ๋ฃ๊ณ priority queue ํฌ๊ธฐ๋ณด๋ค ์ผ์๊ฐ ๋์ง ์๋์ง ๋น๊ตํ๋ค.
priority queue ํฌ๊ธฐ ์์ฒด๊ฐ ๊ธฐํ์ด ๋๋ฉฐ (1๊ฐ ๋ฃ์ผ๋ฉด 1์ผ์ฐจ ์ด๋ด, 2๊ฐ ๋ฃ์ผ๋ฉด 2์ผ์ฐจ ์ด๋ด ๋ฑ)
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๊ธฐ์ ๋งจ ์ ๋ฃจํธ๊ฐ์ ์ต์๊ฐ์ด ์ ์ฅ๋๋ค.
i = 0
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋ priority queue ์ 1์ ๋ฃ๋๋ค. priority queue size (1) < ๊ธฐํ(3)
i = 1
priority queue ์ 2๋ฅผ ๋ฃ๋๋ค. priority queue size (2) < ๊ธฐํ(3)
i = 2
priority queue ์ 3๋ฅผ ๋ฃ๋๋ค. priority queue size (3) == ๊ธฐํ(3)
i = 3
priority queue ์ 90๋ฅผ ๋ฃ๋๋ค. priority queue size (4) == ๊ธฐํ(4)
i = 5
priority queue ์ 100๋ฅผ ๋ฃ๋๋ค. priority queue size (5) > ๊ธฐํ(4)
๋งจ ์์ ์๋ ์ต์ ๊ฐ์๋ฃ(1)๋ฅผ ๋บ๋ค.
[๋ฐ๋ก]
4
2 1
3 1
4 2
5 2
์ ๋ต : 9
5
3 3
2 3
1 3
100 4
90 4
์ ๋ต : 195
[์ฝ๋]
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int universityNum, pay, day, maxPay = 0;
vector<pair<int, int>> v; // ๊ธฐํ, ๊ฐ์ฐ๋ฃ ์กฐํฉ์ ์ผ๋จ ๋ชจ๋ ๋ด์ ๋ฒกํฐ
priority_queue<int, vector<int>, greater<int>> pq; // intํ, prices(๊ฐ์ฐ๋ฃ), ์ค๋ฆ์ฐจ์ ์ ๋ ฌ(๊ฐ์ฅ ์ ์ ๊ฐ์ฐ๋ฃ๊ฐ ๋ฃจํธ์ ์์น)
void Input();
void SearchMaxPay();
void Output();
int main() {
Input();
SearchMaxPay();
Output();
return 0;
}
void Input(){
cin >> universityNum;
for (int i = 0; i < universityNum; i++){
cin >> pay >> day;
v.push_back({ day, pay }); // day(๊ธฐํ)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
}
sort(v.begin(), v.end());
}
// priority queue ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ๋ฒ์ ์ผ๋ก ์ต๋๋น์ฉ ์ฐพ๊ธฐ
void SearchMaxPay() {
for (int i = 0; i < universityNum; i++) {
pq.push(v[i].second);// ์ ์ผ์ ๊ธฐํ๋ถํฐ ๊ฐ์ฐ๋ฃ ์ผ๋จ ๋ฃ๊ธฐ(์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋จ)
// ํ์ฌ pq ์ฌ์ด์ฆ๋ณด๋ค ์ผ์ ๊ธฐํ์ด ํฌ๋ฉด 'd์ผ ์์ ์์' ๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์์ผ๋ฏ๋ก
// ๋งจ์ ์ต์๊ฐ์ ๋นผ๊ณ , ๋ ํฐ๊ฐ์ pq์ ๋ฃ๊ธฐ
if (pq.size() > v[i].first) {
pq.pop();
}
}
}
void Output() {
while (pq.size()) {
maxPay += pq.top(); pq.pop();
}
cout << maxPay << "\n";
}
map ์ผ๋ก ํ๋ค๊ฐ ํ๋ฆฐ์ฝ๋...
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<int, int> scheduleList; // key: day, value: price
int universityNum, price, day, maxPrice = 0;
cin >> universityNum;
for (int i = 0; i < universityNum; i++) {
cin >> price >> day;
if (scheduleList.find(day) == scheduleList.end()) {
scheduleList.insert({ day, price });
}
else {
if (scheduleList[day] < price) {
scheduleList[day] = price;
}
}
}
for (pair<int, int> schedule : scheduleList) {
maxPrice += schedule.second;
}
cout << maxPrice;
return 0;
}