Untitled
unknown
plain_text
11 days ago
3.2 kB
2
Indexable
Never
#include <iostream> #include <set> #include <algorithm> using namespace std; struct res { int mCost, mContent; }; struct Mineral { int cost, mineID, content; }; struct comp { bool operator()(Mineral m1, Mineral m2) const { return m1.cost < m2.cost; } }; set<Mineral, comp> mine_comb[2][3]; // Mảng set để lưu các viên đá theo mỏ và loại int shipfee; void init(int mShipFee) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) mine_comb[i][j].clear(); // Xóa tất cả các set } shipfee = mShipFee; // Thiết lập phí vận chuyển } int gather(int mMineId, int mType, int mCost, int mContent) { Mineral mid; mid.content = mContent; mid.cost = mCost; mid.mineID = mMineId; mine_comb[mMineId][mType].insert(mid); // Thêm viên đá vào mỏ cụ thể mine_comb[2][mType].insert(mid); // Thêm viên đá vào hàng tổng hợp (row 2) return mine_comb[mMineId][mType].size(); } res mix(int mBudget) { int row = -1; res res; res.mContent = 0; res.mCost = 0; int price = 0; int content = -1; Mineral del[3]; // Lưu các viên đá sẽ bị xóa for (int i = 0; i < 3; i++) { auto m = mine_comb[i][0].begin(); // Đá loại 0 auto m1 = mine_comb[i][1].begin(); // Đá loại 1 auto m2 = mine_comb[i][2].begin(); // Đá loại 2 while (m != mine_comb[i][0].end() && m1 != mine_comb[i][1].end() && m2 != mine_comb[i][2].end()) { int p = m->cost + m1->cost + m2->cost + shipfee; // Tính tổng chi phí if (i == 2) p += shipfee; // Hàng tổng hợp phải cộng thêm phí vận chuyển lần nữa if (p <= mBudget) { // Nếu tổng chi phí <= ngân sách int c = min({m->content, m1->content, m2->content}); // Tìm content nhỏ nhất giữa 3 viên đá if (c > content || (c == content && p < price)) { // Cập nhật nếu content tốt hơn hoặc chi phí thấp hơn content = c; price = p; del[0] = *(m); del[1] = *(m1); del[2] = *(m2); row = i; } if (m->content == c) m++; // Nếu content của m nhỏ nhất, tăng m else if (m1->content == c) m1++; // Tăng m1 nếu nó nhỏ nhất else m2++; // Tăng m2 nếu nó nhỏ nhất } else break; // Nếu chi phí vượt quá ngân sách thì ngừng duyệt } } if (price != 0) { // Nếu tìm thấy bộ hợp lệ mine_comb[row][0].erase(del[0]); // Xóa các viên đá trong dòng tìm thấy mine_comb[row][1].erase(del[1]); mine_comb[row][2].erase(del[2]); mine_comb[2][0].erase(del[0]); // Xóa các viên đá trong hàng tổng hợp mine_comb[2][1].erase(del[1]); mine_comb[2][2].erase(del[2]); res.mCost = price; // Cập nhật kết quả res.mContent = content; } return res; // Trả về kết quả }
Leave a Comment