Untitled

mail@pastecode.io avatar
unknown
plain_text
12 days ago
2.6 kB
3
Indexable
Never
#include <unordered_map>
#include <set>
#include <algorithm>
#include <vector>
#include <iostream>
#include <cstring>

using namespace std;

struct cmp {
    bool operator()(pair<int, int> a, pair<int, int> b) const {
        return a.second < b.second; // So sánh dựa trên thời gian đến
    }
};

set<pair<int, int>, cmp> se;
unordered_map<int, int> mp;  // Map xe -> thời gian đến
unordered_map<int, int> q;   // Map xe -> thời gian đến trong hàng đợi
vector<int> parking;

int baseTime, baseFee, unitTime, unitFee, capacity;

void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity) {
    parking.clear();
    se.clear();
    mp.clear();
    q.clear();  // Xóa dữ liệu hàng đợi

    baseTime = mBaseTime;
    baseFee = mBaseFee;
    unitFee = mUnitFee;
    unitTime = mUnitTime;
    capacity = mCapacity;
}

int arrive(int mTime, int mCar) {
    int capaCur = mp.size();
    if (capaCur >= capacity) { // Kiểm tra nếu bãi đầy, thêm vào hàng đợi
        se.insert(make_pair(mCar, mTime));
        q[mCar] = mTime;
    } else { // Thêm vào bãi đỗ
        mp[mCar] = mTime;
    }
    return se.size(); // Trả về số lượng xe đang trong hàng đợi
}

int leave(int mTime, int mCar) {
    int res = 0;
    
    // Trường hợp xe không có trong bãi đỗ (tức là xe nằm trong hàng đợi)
    if (mp.find(mCar) == mp.end()) {
        auto it = se.find(make_pair(mCar, q[mCar]));
        if (it != se.end()) {
            se.erase(it);
        }
        return -1; // Xe không có trong bãi đỗ
    } else { // Xe có trong bãi đỗ
        int t = mp[mCar]; // Thời gian xe vào bãi
        int parkedTime = mTime - t; // Thời gian đỗ xe

        // Tính phí đỗ xe
        if (parkedTime <= baseTime) {
            res = baseFee; // Phí cơ bản
        } else {
            res = baseFee + ((parkedTime - baseTime + unitTime - 1) / unitTime) * unitFee; // Phí bổ sung theo đơn vị thời gian
        }

        // Xóa xe ra khỏi bãi đỗ
        mp.erase(mCar);

        // Kiểm tra xem có xe nào trong hàng đợi không và chuyển nó vào bãi nếu còn chỗ
        if (!se.empty()) {
            auto it = se.begin();
            int carInQueue = it->first;
            int timeInQueue = it->second;
            se.erase(it);
            mp[carInQueue] = timeInQueue; // Di chuyển xe từ hàng đợi vào bãi đỗ
            q.erase(carInQueue); // Xóa xe khỏi hàng đợi
        }
        
        return res; // Trả về phí đỗ xe
    }
    return 0;
}
Leave a Comment