Chỉ đọc hướng giải khi bế tắc và đừng sao chép mã trong đó. Hãy tôn trọng người ra đề và người viết hướng giải: nộp lời giải chính thức khi chưa tự giải được bài có thể khiến bạn bị khóa tài khoản.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k;
vector <pair <int, int>> vecObject;
void Task() {
ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0);
if (fopen("test.inp", "r")) {
freopen("test.inp", "r", stdin);
freopen("test.out", "w", stdout);
}
}
void Solve() {
cin >> n >> k;
vecObject.resize(n);
for (int i = 0; i < n; ++i) {
cin >> vecObject[i].second >> vecObject[i].first;
// vecObject[i] = {v,m};
}
set <pair <int, int>> setBag;
for (int i = 0; i < k; ++i) {
int c;
cin >> c;
setBag.insert({c, i});
// Mỗi chiếc túi có giá trị c và nhãn i
}
sort(vecObject.begin(), vecObject.end());
// Sắp xếp đồ vật theo tăng dần giá trị v
ll ans = 0;
for (int i = n - 1; i >= 0 && !setBag.empty(); --i) {
int weight = vecObject[i].second;
setBag.insert({weight, - 1});
auto it = setBag.find({weight, - 1});
it++;
// Chiếc túi cần tìm nằm ngay sau giá trị {weight, -1} trong set
if (it != setBag.end()) {
setBag.erase(it);
// Nếu tìm thấy, xóa chiếc túi đó đi và cộng giá trị của đồ vật vào đáp án
ans += (ll)vecObject[i].first;
}
setBag.erase({weight, - 1});
}
cout << ans;
}
int main() {
Task();
Solve();
}
Bình luận
Bạn cần đăng nhập để viết bình luận, trả lời và bình chọn.
Bình luận