Untitled
unknown
plain_text
a year ago
2.9 kB
5
Indexable
#include <set>
#include <unordered_map>
#include <queue>
#define MAX_LINE 501
#define MAX_E 501
#define MAX_PROD 20001
using namespace std;
int numLine, numeEq;
struct Product {
int id;
int line;
int eqId;
int endTime;
int workTime;
int status;
};
Product products[MAX_PROD];
struct cmp {
bool operator() (int a, int b) {
if (products[a].endTime == products[b].endTime)
return products[a].id < products[b].id;
return products[a].endTime < products[b].endTime;
}
};
unordered_map<int, int> mpProd;
queue<int> listLine[MAX_LINE];
set<int, cmp> listProducing;
int eq[MAX_E], line[MAX_LINE];
int curTime;
int cntCurProd;
void init(int L, int M) {
curTime = 0;
numLine = L;
numeEq = M;
cntCurProd = 0;
for (int i = 0; i < MAX_LINE; i++) {
line[i] = 0;
}
for (int i = 0; i < MAX_E; i++) {
eq[i] = 0;
}
mpProd.clear();
return;
}
void update(int time, bool haveNew) {
bool haveComplete = false;
while (!listProducing.empty()) {
auto it = listProducing.begin();
if (products[*it].endTime > time) break;
products[*it].status = 3; // hoàn thành
eq[products[*it].eqId] = 0; // thả thiết bị
line[products[*it].line] = 0; // thả line
listProducing.erase(it);
haveComplete = true;
}
if (haveComplete || haveNew) {
for (int i = 0; i < numLine; i++) {
if (!listLine[i].empty()) {
int idx = listLine[i].front();
if (line[products[idx].line] == 0 && eq[products[idx].eqId] == 0) {
listLine[i].pop();
products[idx].status = 2; // đang sản xuất
products[idx].endTime = time + products[idx].workTime;
eq[products[idx].eqId] = 1; // chiếm thiết bị
line[products[idx].line] = products[idx].id; // chiếm line
listProducing.insert(idx);
}
}
}
}
curTime = time;
}
int request(int tStamp, int pId, int mLine, int eId, int mTime) {
for (int i = curTime; i < tStamp; i++) {
update(i, false);
}
cntCurProd++;
products[cntCurProd].id = pId;
products[cntCurProd].line = mLine;
products[cntCurProd].eqId = eId;
products[cntCurProd].workTime = mTime;
products[cntCurProd].status = 1; // đang chờ
products[cntCurProd].endTime = tStamp + mTime;
listLine[mLine].push(cntCurProd);
mpProd[pId] = cntCurProd;
update(tStamp, true);
return line[mLine];
}
int status(int tStamp, int pId) {
for (int i = curTime; i < tStamp; i++) {
update(i, false);
}
if (mpProd.find(pId) == mpProd.end()) return 0; // kiểm tra xem pId có trong mpProd không
return products[mpProd[pId]].status;
}
Editor is loading...
Leave a Comment