Untitled

mail@pastecode.io avatar
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