Untitled
unknown
plain_text
a year ago
2.8 kB
23
Indexable
#include<iostream>
#include<set>
#include<unordered_map>
using namespace std ;
struct CAR
{
int id ;
int timeJoin ;
int total;
int val()
{
return total - timeJoin ;
}
int status ; // status = 1 la dang do , 2 la dang cho , 0 la khoi tao
};
CAR carPool[70001];
struct cmp
{
bool operator ()(int a , int b)
{
int v1 = carPool[a].val();
int v2 = carPool[b].val();
if (v1!= v2)
return v1 >v2 ;
return carPool[a].timeJoin < carPool[b].timeJoin ;
}
};
unordered_map<int ,int> carMap ;
set<int ,cmp > waitingLine ;
int baseTime, baseFee,unitTime,unitFee ;
int capacity ;
int currCap ;
int carNo ;
void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity) {
baseTime = mBaseTime ;
baseFee = mBaseFee ;
unitTime = mUnitTime ;
unitFee = mUnitFee ;
capacity = mCapacity ;
currCap = 0 ;
carNo = 0 ;
carMap.clear();
waitingLine.clear();
return;
}
int arrive(int mTime, int mCar) {
// car moi
if (!carMap.count(mCar))
{
carNo ++ ;
carMap[mCar] = carNo ;
carPool[carNo].id = mCar ;
carPool[carNo].total = 0 ;
carPool[carNo].status = 0 ;
carPool[carNo].timeJoin = 0 ;
}
int tmpID = carMap[mCar];
carPool[tmpID].timeJoin = mTime ;
if (currCap >= capacity)
{
carPool[tmpID].status = 2 ;
waitingLine.insert(tmpID);
}
else
{
currCap++;
carPool[tmpID].status = 1 ;
}
return waitingLine.size();
}
int calFee(int time)
{
if (time <= baseTime)
return baseFee ;
int res ;
if ((time - baseTime) % unitTime == 0)
{
res = (time - baseTime)/unitTime * unitFee + baseFee ;
}
else
res = ((time - baseTime)/unitTime +1) * unitFee + baseFee ;
return res ;
}
int leave(int mTime, int mCar) {
int tmpID = carMap[mCar] ;
if (carPool[tmpID].status == 1)
{
int res = calFee(mTime - carPool[tmpID].timeJoin);
carPool[tmpID].total -=( mTime - carPool[tmpID].timeJoin) ;
currCap -- ;
if (currCap < capacity && !waitingLine.empty())
{
auto pos = waitingLine.begin();
int tmpID2 = *pos;
carPool[tmpID2].status = 1 ;
carPool[tmpID2].total += (mTime - carPool[tmpID2].timeJoin );
carPool[tmpID2].timeJoin = mTime ;
waitingLine.erase(pos);
currCap++;
}
return res ;
}
auto pos2 = waitingLine.find(tmpID);
waitingLine.erase(pos2);
carPool[tmpID].total += (mTime - carPool[tmpID].timeJoin);
return -1;
}Editor is loading...
Leave a Comment