Hướng dẫn giải của TS10 Bình Dương 2023 - Bài 4
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.
Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.
Gợi ý
- Dùng thuật tham lam.
- Gọi ~a_i, b_i~ lần lượt là độ yêu thích của hai tổ với món phần quà thứ ~i~. Sắp xếp các phần quà theo giá trị ~a_i - b_i~ giảm dần, chọn ~n/2~ phần quà đầu cho tổ ~1~ và ~n/2~ phần quà còn lại cho tổ ~2~.
- Có thể chứng minh thuật toán bằng cách: Ta có hai cặp độ yêu thích ~(a_i, a_j)~ và ~(b_i, b_j)~. Giả sử ~a_i-a_j > b_i-b_j~, suy ra ~a_i+b_j > a_j + b_i~.
Code tham khảo
#include <iostream> #include <algorithm> using namespace std; int n; pair<int, int> a[500005]; bool cmp(pair<int, int> a, pair<int, int> b) { return a.first - a.second > b.first - b.second; } int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i].first; cin >> a[i].second; } sort(a, a+n, cmp); int ans = 0; for (int i = 0; i < n/2; i++) { ans += a[i].first; } for (int i = n/2; i < n; i++) { ans += a[i].second; } cout << ans; return 0; }
Bình luận