Untitled
unknown
plain_text
a year ago
3.2 kB
11
Indexable
#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ả
}
Editor is loading...
Leave a Comment