Untitled
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