บริษัทรถยนต์ต้องขาย p คันสีแดง และ q คันสีน้ำเงิน มีสต็อก: a คันสีแดง, b คันสีน้ำเงิน, c คันไม่มีสี (ทาสีได้ทั้ง 2 สี) ราคาในอาร์เรย์ A, B, C ตามลำดับ ต้องการกำไรสูงสุด
ตัวอย่าง: p=3,q=3,a=3,b=3,c=2, A={150000,200000,200000}, B={150000,120000,180000}, C={210000,160000,150000} ผลลัพธ์: 1100000
ขั้นตอนการแก้ปัญหา (Greedy + Prefix Sum)
- เรียง
A, B, Cใหญ่ไปเล็ก - สร้างอาร์เรย์
dpเริ่มด้วย 0 แล้วใส่pค่าแรกของAและqค่าแรกของB - เรียง
dpใหญ่ไปเล็ก คำนวณ prefix sum - ลองนำรถไม่มีสี
i = 1 ถึง min(c, p+q)คันมาใช้ (ค่าสูงสุดiคันแรกของC) แทนที่ค่าต่ำสุดในdpคำนวณผลรวมใหม่ หาค่าสูงสุด
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
int solve(int p, int q, int a, int b, int c,
vector<int> A, vector<int> B, vector<int> C) {
vector<int> dp(1, 0);
sort(A.rbegin(), A.rend());
sort(B.rbegin(), B.rend());
sort(C.rbegin(), C.rend());
for (int i = 0; i < p; ++i) dp.push_back(A[i]);
for (int i = 0; i < q; ++i) dp.push_back(B[i]);
sort(dp.begin(), dp.end());
reverse(dp.begin() + 1, dp.end());
for (int i = 1; i < (int)dp.size(); ++i) dp[i] += dp[i-1];
int tmp = 0, res = dp.back();
for (int i = 1; i <= min(c, p + q); ++i) {
tmp += C[i-1];
res = max(res, dp[p + q - i] + tmp);
}
return res;
}
int main() {
int p = 3, q = 3, a = 3, b = 3, c = 2;
vector<int> A = {150000, 200000, 200000};
vector<int> B = {150000, 120000, 180000};
vector<int> C = {210000, 160000, 150000};
cout << solve(p, q, a, b, c, A, B, C);
return 0;
}
อินพุต / เอาต์พุต
Input: 3, 3, 3, 3, 2, {150000,200000,200000}, {150000,120000,180000}, {210000,160000,150000}
Output: 1100000