Untitled
unknown
plain_text
2 years ago
2.4 kB
10
Indexable
#include<set>
#include<unordered_map>
#include<queue>
using namespace std;
#define NONE 0
#define PARKING 1
#define WATTING 2
struct car{
int state;
int id;
int start_ParkingTime;
int total_ParkingTime;
int start_WatingTime;
int total_WatingTime;
car(){
start_ParkingTime=0;
total_ParkingTime=0;
start_ParkingTime=0;
total_WatingTime=0;
}
};
struct cmp{
bool operator()(car a,car b)
{
int p1 = a.total_WatingTime-a.start_WatingTime-a.total_ParkingTime;
int p2 = b.total_WatingTime-b.start_WatingTime-b.total_ParkingTime;
if(p1!=p2)
return p1>p2;
return a.start_WatingTime<b.start_WatingTime;
}
};
unordered_map<int,car> list_car;
set<car,cmp> wating;
int BaseTime;
int BaseFree;
int UnitTime;
int UnitFree;
int Capacity;
void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity) {
BaseTime = mBaseTime;
BaseFree = mBaseFee;
UnitTime = mUnitTime;
UnitFree = mUnitFee;
Capacity = mCapacity;
list_car.clear();
wating.clear();
return;
}
int arrive(int mTime, int mCar) {
car newcar ;
if(list_car.find(mCar)!=list_car.end())
newcar = list_car[mCar];
newcar.id=mCar;
if(Capacity>0){
Capacity-=1;
newcar.start_ParkingTime=mTime;
newcar.state = PARKING;
}
else{
newcar.state=WATTING;
newcar.start_WatingTime = mTime;
wating.insert(newcar);
}
list_car[mCar]=newcar;
return wating.size();
}
int caculator(int time)
{
if(time<=BaseTime)
return BaseFree;
else
{
return BaseFree+(time-BaseTime+UnitTime-1)/UnitTime*UnitFree;
}
}
int leave(int mTime, int mCar) {
auto newcar1 = list_car.find(mCar);
if(newcar1->second.state==WATTING)
{
car newcar = newcar1->second;
wating.erase(newcar);
newcar1->second.state=NONE;
newcar1->second.total_WatingTime += mTime-newcar1->second.start_WatingTime;
return -1;
}
newcar1->second.state=NONE;
newcar1->second.total_ParkingTime+=mTime-newcar1->second.start_ParkingTime;
Capacity+=1;
if(!wating.empty())
{
car temp = *wating.begin();
wating.erase(*wating.begin());
list_car.erase(temp.id);
Capacity-=1;
temp.state=PARKING;
temp.start_ParkingTime = mTime;
temp.total_WatingTime +=mTime-temp.start_WatingTime;
list_car.insert(make_pair(temp.id,temp));
}
return caculator(mTime-newcar1->second.start_ParkingTime);
}Editor is loading...