Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
2.4 kB
3
Indexable
Never
#include <iostream>
#include <set>
#include <unordered_map>
#include <vector>
#include <cstring>
using namespace std;

// Comparator cho set, sắp xếp theo thời gian tăng dần, nếu thời gian bằng thì so sánh theo ID giảm dần
struct cmp{
    bool operator()(pair<int, int> a, pair<int, int> b) const {
        if(a.second == b.second) return a.first > b.first;
        return a.second > b.second;
    }
};

unordered_map<int, int> mp;   // Lưu thông tin ID máy và thời gian
set<pair<int, int>, cmp> se;  // Set để sắp xếp các máy theo yêu cầu

void init(int N, int mId[], int mTime[]) {
    mp.clear();
    se.clear();
    for(int i = 0; i < N; i++) {
        se.insert(make_pair(mId[i], mTime[i]));
        mp[mId[i]] = mTime[i];
    }
}

int add(int mId, int mTime) {
    if(mp.find(mId) != mp.end()) {
        int time_tmp = mp[mId];
        se.erase(make_pair(mId, time_tmp)); // Xóa giá trị cũ trong set
    }
    // Cập nhật giá trị mới
    mp[mId] = mTime;
    se.insert(make_pair(mId, mTime)); // Thêm giá trị mới vào set
    return mp.size();
}

int remove(int K) {
    for(int i = 0; i < K; i++) {
        auto it = se.begin();  // Lấy phần tử nhỏ nhất (dựa trên comparator)
        int key = it->first;
        se.erase(it);          // Xóa phần tử trong set
        mp.erase(key);         // Xóa phần tử trong map
    }
    return se.begin()->first;  // Trả về ID máy có thời gian nhỏ nhất sau khi xóa
}

int produce(int M) {
    int curTime = 0, curTotal = 0;
    auto minMachine = se.rbegin();  // Lấy phần tử có thời gian lớn nhất (set sắp xếp ngược)

    for (int i = 1; i <= M; i++) {
        curTotal = i;
        curTime = minMachine->second * i;  // Tính thời gian dựa trên máy có thời gian lớn nhất

        // Tính toán tổng số sản phẩm dựa trên các máy còn lại
        if(curTotal != M) {
            for(auto it = se.begin(); it != se.end(); it++) {
                if(it->first != minMachine->first) {
                    curTotal += curTime / it->second;
                }
            }
            if(curTotal >= M) return curTime;  // Nếu đủ số lượng, trả về thời gian
        }
    }
    return 0;  // Trả về 0 nếu không thể sản xuất đúng số lượng
}
Leave a Comment