: ๊ธฐ์กด ๊ทธ๋ฆฌ๋์๋ ๋ค๋ฅด๊ฒ
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋
bag์ ๋ฌด๊ฒ์ gems์ ๋ฌด๊ฒ๋ฅผ ๋น๊ตํ๋ฉด์ bag๋ณด๋ค ๋ฌด๊ฒ๊ฐ ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ์
jems์ ๊ฐ๊ฒฉ๊ณผ ๋น๊ต๋ฅผ ํ๋ฉด์ pq์๋ค๊ฐ ๋ฃ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๋ ๊ฑฐ๋ ๊ฐ์ฅ ๋์ ๊ฐ๊ฒฉ์ด๋๊น.
pq์ top์ด ๋์ ๊ฐ๊ฒฉ์ด ์ฌ๋ผ์ฌ์ ์๊ฒ ๋ํดํธ๋ก ์ ๋ ฌํด๋์.
1) bag๋ณด๋ค ๋ฌด๊ฒ๊ฐ ์์ jems๋ค์ ํ๊ฒ์ผ๋ก ํด์ ๋ชจ๋ ๋ค pq ๋ฃ์.
2) ๊ทธ๋ฌ๋ค๊ฐ ๊ฐ๋ฐฉ ๋ฌด๊ฒ๋ณด๋ค ๋์ jems์ด ๋์ค๋ฉด ํ์ถ
-> ๊ฐ๋ฐฉ ํ๋์ jems 1๊ฐ ๋ฃ์ ์ ์์๋๊น. top์ ์๋ ํ๋๋ฅผ ๋ฝ์.
3) ๊ทธ๋ฆฌ๊ณ ์ด์ bag ์ ์ธ๋ฑ์ค๋ฅผ ํ๋ ์ฆ๊ฐํด์ ๊ทธ๊ฑฐ๋ ๋ค์๋ฒ์ ์๋ gems๋ฅผ ๋น๊ตํ๋ค.
: ๋ด ์๊ฐ์๋ ๊ฐ๋ฐฉ์ด๋ ๋ณด์ ๋๋ค ๋ฌด๊ฒ๋ฅผ ๊ฐ์ฅ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ ์ํ์์ ์งํํ๊ณ ์ ํจ.
1 10
1 9
1 5
3 50
5 4
10 100
์ด๋ ๊ฒ ๋ณด์์ด ์๊ณ ,
๊ฐ๋ฐฉ์ 1๊ฐ ์ธ๋ฐ ๋ฌด๊ฒ๊ฐ 3์ง๋ฆฌ๊ฐ ์๋ค๊ณ ํ์.
๊ฐ๋ฐฉ์๋ค๊ฐ ์
๋ ฅํ ๋๋ถํฐ pair< ๋ฌด๊ฒ , ๊ฐ๊ฒฉ ์ ์ผ ํฐ๊ฑฐ> ๋ก ๋ฃ๊ธฐ ์ํด pq๋ฅผ ์ด๋ฐ์์ผ๋ก ๊ตฌ์ฑํจ.
priority_queue<pair<int,int> ,
vector<pair<int,int>>, compare > pq;
#include <iostream>
using namespace std;
#include <vector>
#include <queue>
struct compare
{
bool operator()(pair<int,int>& a, pair<int,int>& b)
{
if (a.first == b.first)
{
return a.second < b.second;
}
else
return a.first > b.first;
}
};
int main()
{
int n, k;
cin >> n >> k;
priority_queue<pair<int,int> ,
vector<pair<int,int>>, compare > pq;
//vector<gem> gems(n);
// ๊ฐ ๋ณด์ n๊ฐ๋๋ฌด๊ฒ m๊ณผ ๊ฐ๊ฒฉ v๋ฅผ ๊ฐ์ง๊ณ ์์.
int a, b;
for (int i = 0; i < n; ++i)
{
cin >> a >> b;
pq.push(make_pair(a, b));
}
//while (!pq.empty())
//{
// auto iter = pq.top();
// pq.pop();
//
// //cout << iter.first << " " << iter.second << endl;
//}
// ์๋์ด๊ฐ ํ์น ์ ์๋ ๋ณด์ ๊ฐ๊ฒฉ์ ํฉ์ ์ต๋๊ฐ.
vector<int> bags(k);
for (int i = 0; i < k; ++i)
{
cin >> bags[i];
}
sort(bags.begin(), bags.end());
//for (int i = 0; i < bags.size(); ++i)
//{
// cout << bags[i] << endl;
//}
// ๋ฌด๊ฒ๊ฐ ์๋๋ผ, ์ต๋์ ๋ณด์ ๊ฐ๊ฒฉ์ด๋๊น.
// money ์์ฃผ๋ก ์ ๋ ฌ์ ์ํค์. ๊ทธ๋ฌ๋ฉด์
//
// bags ๋ ๋ฌด๊ฒ๊ฐ ๊ฐ์ฅ ์์ ๊ฒ์ ์์นํ์.
// ๋ฌด๊ฒ๊ฐ ์์์๋ก ๋ ๋ง์ ๋ณด์์ ๋ด์ ์ ์๊ธฐ ๋๋ฌธ์.
// ์ ๊ฐ๋ฐฉ์๋ ์ต๋ ํ๊ฐ์ ๋ณด์๋ง ๋ฃ์ ์ ์๋ค.
// 30๋ง * 30๋ง -> 30 30 10000 10000 -> 900 100000000
// 1 65
// 2 99
// 2
// 30๋ง 30๋ง ๋๋ฆฌ๊ธฐ์๋ ์๊ฐ๋ณต์ก๋ ์ด๊ณผ์ด๋๊น
// pq์๋ค๊ฐ ๋ฃ์ผ๋ฉด ์ต๊ณ ์ ์ํ๋ฅผ ๋ฝ์๋ค ํ์ธํ๋ ์์ผ๋ก ํฎ.
// ๋ฌด๊ฒ ์์ฃผ๋ก ํด์ผ๊ฒ ๋ค.
// ๊ฐ๋ฐฉ๋ ๋ฎ๊ฒ ์ค์ ํ์.
// ๋ฌด๊ฒ๋ก ๊ฐ์.
// ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ gem ์ ๋ฌด๊ฒ๋ฅผ ๋น๊ตํ๋ฉด์
// ๋์ผํ ๋๊น์ง ์งํํ๋ฉด์ ์ต๊ณ ์ ์๋จ์ ๋ฝ์.
// -> ๊ฐ๊ฒฉ์ด ์ต๋์ธ๊ฑฐ๋ฅผ ์ป์.
int ret = 0;
for (int i = 0; i < bags.size(); ++i)
{
int mmax = -1;
// ๊ฐ๋ฐฉ ๋งจ์์ ์ธ๋ฑ์ค๋ฅผ ํ๊ฒ์ผ๋ก ํด์
// pq ๋บ๋บ์ด ๋๋ฆฌ๋ฉด์ ์ต๋์ money๋ฅผ ์ป์.
{
while (!pq.empty() && pq.top().first <= bags[i])
{
auto iter = pq.top();
pq.pop();
if (mmax < iter.second)
{
mmax = iter.second;
}
}
}
if(mmax != -1)
ret += mmax;
}
cout << ret << endl;
}
: bags์ for๋ฌธ ๋๋ฆด ๋ pq์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ณ ์ํจ.
์กฐ๊ฑด์ ํด๋นํ ๊ฒฝ์ฐ, pq์๋ค๊ฐ ๋ฃ์.
-> ํ๋ค ๋ณด๋๊น index๋งํผ while ๋ฌธ ๋๋ฆฌ๊ธฐ ์ํ ์กฐ๊ฑด์ ์ถ๊ฐ๋จ.
๋ฃ์ ํ์ ์ต๊ณ ์ money๊ฐ ์์ ์ฌ๋ผ์ ์๋ ์ํ์์ bags์ ๊ฐฏ์๋งํผ๋ง ret์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ณ ์ ํจ.
-> ์ด๋ ๊ฒ ํ๋ฉด 3ํผ์ผํธ์์ ํ๋ฆผ.
: ํ๋ฆฐ ์ฝ๋๋ ์ธ๋ถ์์ while๋ฌธ ๋๋ฆฌ๋ฉด์ ๋์ ํ๋ ๋ถ๋ถ์ด๋ค.
์ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋์ ๋ํด์...
๋์ฒ๋ผ ํ๊ฒ ๋๋ฉด, ์กฐ๊ฑด์์ด ์ถ๊ฐ๋๊ณ ,
๋ ๋ค์ pq์ ๋ฃ์ด์ง ๊ฐ์ ๋ํ ์๊ฐ๋ณต์ก๋๊ฐ ์ถ๊ฐ๋จ. pq์ ์ด 30๋ง๊ฐ ๋ค์ด๊ฐ ์ ์์.
(๋ฌธ์ ์กฐ๊ฑด์์ ์ํด) , ์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ฉด ์๊ฐ๋ณต์ก๋ ์ต์ ์ 30๋ง์ด ์ถ๊ฐ๋จ.
-> ์ฐจ๋ผ๋ฆฌ ์ bags์ for๋ฌธ์์ ์ฒ๋ฆฌํ๋ฉด ์๊ฐ๋ณต์ก๋ pq.pop() 1๋ก ์ฒ๋ฆฌํ ์ ์์.
์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ฉด 30๋ง์ ์๋ ์ ์์.
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <queue>
struct compare
{
bool operator()(pair<int,int>& a, pair<int,int>& b)
{
if (a.first == b.first)
{
return a.second < b.second;
}
else
return a.first > b.first;
}
};
int main()
{
int n, k;
cin >> n >> k;
vector<pair<long long, long long>> gems(n);
// ๊ฐ ๋ณด์ n๊ฐ๋๋ฌด๊ฒ m๊ณผ ๊ฐ๊ฒฉ v๋ฅผ ๊ฐ์ง๊ณ ์์.
int a, b;
for (long long i = 0; i < n; ++i)
{
cin >> gems[i].first;
cin >> gems[i].second;
}
sort(gems.begin(), gems.end());
vector<long long> bags(k);
for (long long i = 0; i < k; ++i)
{
cin >> bags[i];
}
sort(bags.begin(), bags.end());
long long ret = 0;
long long index = 0;
long long cnt = 0;
priority_queue<long long> pq;
for (long long i = 0; i < bags.size(); ++i)
{
int mmax = -1;
while (index < gems.size()
&& bags[i] >= gems[index].first)
{
pq.push(gems[index].second);
index++;
if (index >= gems.size())
break;
}
//if (!pq.empty())
//{
// ret += pq.top();
// pq.pop();
//}
}
while (!pq.empty())
{
//cout << pq.top() << endl;
ret += pq.top();
pq.pop();
cnt++;
if (cnt == bags.size())
break;
}
cout << ret << endl;
}
https://www.acmicpc.net/submit/1202/72976274
: ์ฐ์ ์์ํ๋ฅผ top์ด ๋ฎ๊ฒ ์ค์ ์ ํ๊ณ , bag์ ๊ฐฏ์์ ๋ง์ง ์๋ค๋ฉด?
pop์ ํ ํ, ํ๋ฒ์ ๋ํ๋ ๋ฐฉ์์ผ๋ก ํ์.
-> 7ํผ์ผํธ์์ ํ๋ฆผ.
: ๋๊ฐ๋ก ๋ถ๋ฅํ๋๋ ํ๋ฆผ..
- ์ด ์๊ฐ๋ ๋ง์ง๋ง, ์ด๋ ๊ฒ ํ๊ฒ ๋ ๊ฒฝ์ฐ, pq์ ๋ฃ๋ ๋ถ๋ถ๊ณผ
sum์ ๋์ ํ๋ ๋ถ๋ถ์ ๋๋์ด์ ์ฒ๋ฆฌ๋ฅผ ํด์ผํจ.
-> pq์ ๋ณด์์ ์ต๋ ๊ฐ์ 30๋ง์ด ๋ค์ด๊ฐ ์ ์์.
๋ถ๋ฆฌํด์ ํ๋ฉด 30๋ง๋ฒ์ ์๊ฐ๋ณต์ก๋๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์.
: ๋ฌธ์ ์ ๊ด๊ฑด์ด ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๊ฐ๋ฐฉ ํ๋ ์๋ฃ๋ ๋๋ง๋ค ๊ฐ์ฅ ํฐ๊ฐ ํ๋๋ง ์ถ์ถํ์!
: ์์ ์๊ฐ๋ณด๋ค๋ pq์ top์ ์ต๋๊ฐ์ผ๋ก ์ค์ ์ ํ๊ณ ,
๊ฐ๋ฐฉ ๋ฌด๊ฒ ์ด๊ณผํ ๊ฒฝ์ฐ, ๊ทธ ๋ถ๋ถ์์ ํ๋ฒ๋ง ๋์ ํ๋ ์กฐ๊ฑด์ผ๋ก ํ๋
๊ฒ์ด ์คํ๋ ค ํจ์จ์ ์.
์ ๊ทผ๋ฐฉ๋ฒ 1๋ฒ : pq๋ฅผ ๋ฎ๊ฒ.
๊ฐ๋ฐฉ ๋ฌด๊ฒ : 2, 10
๋ณด์ 1-65 , 2-99 , 5-23์์
๊ฐ๋ฐฉ ๋ฌด๊ฒ 2 ์ข
๋ฃ : top : 65 99
๊ฐ๋ฐฉ ๋ฌด๊ฒ 10 ์ข
๋ฃ : top : 23 65 99
bag์ for๋ฌธ ๋๋๊ณ bag์ ์ฌ์ด์ฆ (2๊ฐ) ์ ๋ง์ถฐ์ pq.pop์ ํ๋ฒ๋ง ํ๊ธฐ
-> 65 , 99๋ฅผ ๋์ ํจ.
์ ๊ทผ๋ฐฉ๋ฒ 2๋ฒ : pq๋ฅผ ๋๊ฒ
๊ฐ๋ฐฉ ๋ฌด๊ฒ : 2, 10
๋ณด์ 1-65 , 2-99 , 5-23์์
๊ฐ๋ฐฉ ๋ฌด๊ฒ 2์ข
๋ฃ : top : 99 65
-> ์กฐ๊ฑด๋ฌธ ๋ง์น๊ณ , ๊ฐ์ฅ ํฐ 99๋ฅผ ๋์ ์ํด
๊ฐ๋ฐฉ ๋ฌด๊ฒ 10 ์ข
๋ฃ : top : 65 23
-> ์กฐ๊ฑด๋ฌธ ๋ง์น๊ณ ๊ฐ์ฅ ํฐ 65๋ฅผ ๋์ ์ํด.
=> ๋ฌด์์ด ๋ ํจ์จ์ ์ด ์ํ์ค์ผ๊น? ๋ฅผ ์๊ฐํ๋ฉด , ์ ๊ทผ ๋ฐฉ๋ฒ 2๋ฒ์ด
ํจ์ฌ ํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ์๊ฐํ ์ ์์.
// ํ์ด์ ๋ต
// 1. pair ๊ฐ์ money ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์
// ์๋ํ๋ฉด? ๊ฐ์ฅ ํฐ ๋ณด์ ๊ฐ๊ฒฉํฉ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก.
// 2. ๊ฐ์ฅ ํฐ money๋ฅผ ๋ฝ๊ธฐ ์ํด์
// ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ ๊ฐ์ฅ ํฐ ๊ฐ์ ์๋ก ์ฌ๋ฆฌ์. ์ฆ, ๋ด๋ฆผ ์ฐจ์์ผ๋ก
// ์๋ํ๋ฉด? ๋ ผ๋ฆฌ์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด, money๊ฐ ๊ฐ์ฅ ํฐ๊ฐ์ด
// ๋ฌด๊ฒ๊ฐ ํด ์ ์๊ธฐ ๋๋ฌธ์.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด . 7%์์ ํ๋ฆผ.
-> ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ธ๋์ง ์๊ฐํด๋ณด์.
์ฐ๋๋ฅด๊ธ ํ์ธ ์ ํ์ด ํ์ํจ.
--> ์ ๋ ฌ๊ณผ pq๋ฅผ ์ฌ์ฉํ์.
-> 7%์์ ํ๋ฆผ.
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <queue>
int main()
{
//30๋ง 30๋ง
// 23 5
// 65 1
// 99 2
// 99 2
// 65 1
// 23 5
// 1 65
// 2 99
// 5 23
// 5 23
// 2 99
// 1 65
// 2
//10
// 10
// 2
// ํ์ด์ ๋ต
// 1. pair ๊ฐ์ money ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์
// ์๋ํ๋ฉด? ๊ฐ์ฅ ํฐ ๋ณด์ ๊ฐ๊ฒฉํฉ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก.
// 2. ๊ฐ์ฅ ํฐ money๋ฅผ ๋ฝ๊ธฐ ์ํด์
// ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ ๊ฐ์ฅ ํฐ ๊ฐ์ ์๋ก ์ฌ๋ฆฌ์. ์ฆ, ๋ด๋ฆผ ์ฐจ์์ผ๋ก
// ์๋ํ๋ฉด? ๋
ผ๋ฆฌ์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด, money๊ฐ ๊ฐ์ฅ ํฐ๊ฐ์ด
// ๋ฌด๊ฒ๊ฐ ํด ์ ์๊ธฐ ๋๋ฌธ์.
long long n, k;
cin >> n >> k;
vector<pair<long long, long long>>v(n);
for (long long i = 0; i < n; ++i)
{
cin >> v[i].second >> v[i].first;
}
sort(v.begin(), v.end(), greater<pair<long long, long long>>());
//cout << "๋ณด์์ ๋ฌด๊ฒ์ " << endl;
//for (auto iter : v)
//{
// cout << iter.first << ' ' << iter.second << endl;
//}
vector<long long >bag(k);
// ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ ์
๋ ฅํ์.
for (long long i = 0; i < k; ++i)
{
cin >> bag[i];
}
// ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ง๋ค์ด์ผ ํจ.
sort(bag.begin(), bag.end(), greater<long long>());
//for (auto iter : bag)
// cout << iter << endl;
long long idx = 0;
long long res = 0;
//for (int i = 0; i < bag.size(); ++i)
{
for (long long j = 0; j < v.size(); ++j)
{
long long weight = v[j].second;
if (weight < bag[idx])
{
++idx;
res += v[j].first;
}
if (idx == bag.size())
break;
}
}
cout << res;
}
: ๋ด๊ฐ ๋ชจ๋ฅด๋ ๋ฐ๋ก๊ฐ ์๋๋ฏํจ.
1) ๋ณด์์ ๋ฌด๊ฒ - ๊ฐ๊ฒฉ ์ผ๋ก ํด์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋์.
2) ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ๋๊ณ .
๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ณด๋ค ์ดํ์ธ ๋ณด์์ ๋ฌด๊ฒ๋ฅผ ์ฒดํฌํ๋ฉด์ ๊ฐ์ฅ ํฐ ๊ฐ๊ฒฉ์
์บ์นํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์.
-> ์๋ชป๋ ์๊ฐ!
- ๋ฐ๋ก : ๋ฌธ์ ํธ๋๋ฐ ๊ฐ์ฅ ์ค์ํ ์ง์
๊ฐ๋ฐฉ์ ๋ฌด๊ฒ 2 , 10
๋ณด์ (2,97), (2,67) , (10,5)
๊ฐ ์๋ค๊ณ ํ ๋
๊ฐ๋ฐฉ 2์๋ค๊ฐ ๋ฃ์๋ (2,97)๋ง ๋ฃ๊ณ , (2,67)์ ๋ฒ๋ฆฌ๋ฉด ์๋จ!
์๋ํ๋ฉด ๊ทธ ๋ค์์
๊ฐ๋ฐฉ 10์๋ค๊ฐ (10,5) ๋ฅผ ๋ฃ๊ฒ ๋๋ฉด
-> ์ต๋๊ฐ์ด ์๋์ด.
๋ฐ๋ผ์ ์ฐ์ ์์ ํ์๋ค๊ฐ ๋จผ์ ํด๋นํ๋ ๊ฐ์ ๋ฃ์ด๋๊ณ , pop์ ์ํ ์ํ์์
(10, 5)๋ฅผ ๋ฃ์ด๋์ ์ํ์์ ๋น๊ตํ์๋ ๊ฒ์.
์ฐ์ ์์ ํ ํน์ฑ์ด ๊ฐ์ฅ ์์ ๊ฐ, ๊ฐ์ฅ ํฐ ๊ฐ์ top()์ ์์น์ํค๋ฏ๋ก
pop์ ๊ฒฝ์ฐ๋ result ๊ฐ์ ๋์ ํ ๋๋ง ์ฌ์ฉํ์.
๋ง์ฝ ์ฌ๊ธฐ์ (2,97) ๊ณผ (2,67)์ ๋น๊ตํด์ ์ฐ์ ์์ ํ์ (2,97) ๋ง ๋ฃ๋๋ค๋ฉด
๋ฌธ์ ๋ค!
pq์ ๋ฃ๋๋ค๋ฉด, ๊ฐ์ฅ ์์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฃ์ผ๋ฉด, ๋์ค์ ํฐ๊ฐ ๋น๊ตํ๋๋ผ๋,
์ด๋ฏธ pq์ ๋ฃ๊ฒ ๋๋ฏ๋ก, ๋ฌธ์ ๊ฐ ์์.