Untitled
unknown
plain_text
5 days ago
2.4 kB
2
Indexable
Never
#include <iostream> #include <set> #include <unordered_map> using namespace std; struct Car{ int id; int tDen; int totalParking; int totalWaiting; int tWait; int tPark; }cars[70001]; struct cmp{ bool operator()(Car a, Car b) { int x = a.totalWaiting - a.totalParking; int y = b.totalWaiting - b.totalParking; if(x == y) return a.tDen < b.tDen; return x > y; } }; unordered_map<int, int>mp; set<Car, cmp>se; int bTime, bFee, uTime, uFee, capacity, cnt; void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity) { bTime = mBaseTime; bFee = mBaseFee; uTime = mUnitTime; uFee = mUnitFee; capacity = mCapacity; cnt = 0; mp.clear(); se.clear(); } int arrive(int mTime, int mCar) { if(mp.find(mCar) != mp.end()) { //Chua tung xuat hien if(capacity) { //Neu con slot capacity--; mp[mCar] = cnt; cars[cnt].id = mCar; cars[cnt].tDen = mTime; cars[cnt].totalParking = 0; cars[cnt].totalWaiting = 0; cars[cnt].tPark = 0; cars[cnt].tWait = 0; cnt++; } else { // Het slot mp[mCar] = cnt; cars[cnt].id = mCar; cars[cnt].tDen = mTime; cars[cnt].totalParking = 0; cars[cnt].totalWaiting = 0; cars[cnt].tPark = 0; cars[cnt].tWait = mTime; se.insert(cars[cnt]); cnt++; } } else { //Da tung xuat hien int idx = mp[mCar]; if(capacity) { //Neu con slot capacity--; cars[idx].tDen = mTime; cars[idx].tPark = mTime; } else { //Neu het slot cars[idx].tDen = mTime; cars[idx].tWait = mTime; se.insert(cars[idx]); } } return se.size(); } int leave(int mTime, int mCar) { int ans = 0; int idx = mp[mCar]; if(se.find(cars[idx]) == se.end()) { //Trong parking capacity++; cars[idx].totalParking += mTime - cars[idx].tPark; //Tinh cost int timePark = mTime - cars[idx].tPark; if(timePark <= bTime) ans = bFee; else { int timeN = timePark / bTime; int timeMod = timePark % bTime; if(timeMod > 0) timeN++; ans = bFee + timeN * uFee; } //Neu con xe waiting if(!se.empty()) { auto topCar = se.begin(); int idCar = topCar->id; int idxCar = mp[idCar]; cars[idxCar].tPark = mTime; } else { capacity++; } } else {//Waiting se.erase(cars[idx]); cars[idx].totalWaiting = mTime - cars[idx].tWait; cars[idx].tWait = 0; return -1; } return 0; }
Leave a Comment