Untitled
unknown
plain_text
7 days ago
3.0 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()(const Car &a, const Car &b) const { 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; // Map car ID to car index set<Car, cmp> se; // Waiting list ordered by cmp 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()) { // Xe mới xuất hiện 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; if (capacity > 0) { // Còn chỗ đỗ xe cars[cnt].tPark = mTime; capacity--; } else { // Hết chỗ, thêm vào danh sách chờ cars[cnt].tWait = mTime; se.insert(cars[cnt]); } cnt++; } else { // Xe đã từng xuất hiện trước đó int idx = mp[mCar]; if (capacity > 0) { // Còn chỗ đỗ xe cars[idx].tDen = mTime; cars[idx].tPark = mTime; capacity--; } else { // Hết chỗ, thêm vào danh sách chờ cars[idx].tDen = mTime; cars[idx].tWait = mTime; se.insert(cars[idx]); } } return se.size(); } int leave(int mTime, int mCar) { int idx = mp[mCar]; if (se.find(cars[idx]) == se.end()) { // Xe đang đỗ cars[idx].totalParking += (mTime - cars[idx].tPark); capacity++; // Tính phí đỗ xe int timePark = mTime - cars[idx].tPark; int fee = bFee; if (timePark > bTime) { int extraTime = timePark - bTime; fee += ((extraTime + uTime - 1) / uTime) * uFee; // Làm tròn lên } // Nếu có xe đang chờ, chuyển xe từ danh sách chờ vào bãi if (!se.empty()) { auto topCar = *se.begin(); int idCar = topCar.id; se.erase(se.begin()); int idxCar = mp[idCar]; cars[idxCar].tPark = mTime; cars[idxCar].totalWaiting += (mTime - cars[idxCar].tWait); capacity--; // Đã dùng 1 slot đỗ } return fee; } else { // Xe đang trong danh sách chờ se.erase(cars[idx]); cars[idx].totalWaiting += (mTime - cars[idx].tWait); cars[idx].tWait = 0; return -1; } }
Leave a Comment