Untitled

mail@pastecode.io avatar
unknown
plain_text
20 days ago
3.3 kB
3
Indexable
Never
#include <set>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int fee;
struct stone {
    int id;
    int cost;
    int content;
    int type;
    
    stone(int id, int type, int cost, int content) {
        this->id = id;
        this->cost = cost;
        this->content = content;
        this->type = type;
    }
    
    bool operator<(const stone& other) const {
        // So sánh dựa trên chi phí trước, nếu bằng thì so sánh theo id để tránh trùng lặp
        if (cost == other.cost) {
            return id < other.id;
        }
        return cost < other.cost;
    }
};

stone del0 = stone(0, 0, 0, 0);
stone del1 = stone(0, 0, 0, 0);
stone del2 = stone(0, 0, 0, 0);

set<stone> table[3][3];

struct Result {
    int mCost;
    int mContent;
};

void init(int mShipFee) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            table[i][j].clear();
        }
    }
    fee = mShipFee;
}

int gather(int mMineId, int mType, int mCost, int mContent) {
    stone tmp = stone(mMineId, mType, mCost, mContent);
    table[mMineId][mType].insert(tmp);
    table[2][mType].insert(tmp);  // Thêm vào hàng tổng hợp
    return 0;
}

Result mix(int mBudget) {
    int row = -1;
    Result res = {0, 0};
    int contentRes = -1;
    int costRes = 99999999;
    
    for (int i = 0; i < 3; i++) {
        auto stone0 = table[i][0].begin();
        auto stone1 = table[i][1].begin();
        auto stone2 = table[i][2].begin();
        
        while (stone0 != table[i][0].end() && stone1 != table[i][1].end() && stone2 != table[i][2].end()) {
            int costCur;
            if (i != 2) {
                costCur = stone0->cost + stone1->cost + stone2->cost + fee;
            } else {
                costCur = stone0->cost + stone1->cost + stone2->cost + 2 * fee;
            }
            
            if (costCur <= mBudget) {
                // Sử dụng initializer list cho hàm min để lấy giá trị nhỏ nhất trong 3 content
                int contentCur = min({stone0->content, stone1->content, stone2->content});
                
                // Cập nhật kết quả tốt hơn
                if (contentCur > contentRes || (contentCur == contentRes && costCur < costRes)) {
                    contentRes = contentCur;
                    costRes = costCur;
                    del0 = *stone0;
                    del1 = *stone1;
                    del2 = *stone2;
                    row = i;
                }
            }
            
            // Tăng iterator dựa trên content nhỏ nhất
            if (stone0->content == contentCur) {
                stone0++;
            } else if (stone1->content == contentCur) {
                stone1++;
            } else {
                stone2++;
            }
        }
    }

    if (row != -1) {
        // Xóa các viên đá trong dòng hiện tại và bảng tổng hợp
        table[row][0].erase(del0);
        table[row][1].erase(del1);
        table[row][2].erase(del2);
        table[2][0].erase(del0);
        table[2][1].erase(del1);
        table[2][2].erase(del2);
        
        res.mCost = costRes;
        res.mContent = contentRes;
    } else {
        res.mCost = 0;
        res.mContent = 0;
    }

    return res;
}
Leave a Comment