Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
5.6 kB
3
Indexable
Never
#define MAXN        100
#define MAXL        8
#include <queue>
#include <unordered_map>
#include <string>
using namespace std;
struct Customer
{
    int ticketEnd;
    int rentStart;
    int durability;
}user[10010];
int maxRideTime;
 
struct Bike
{
    int timeUsed;
    bool operator < (const Bike &other) const {return timeUsed < other.timeUsed;}
};
 
 
struct Station
{
    int deliverTime;
    int newBike;
    priority_queue<Bike> bikeUsed;
    queue<int> bikeDeliver;
}S[110];
int uID, sID;
unordered_map<string,int> hashUser;
 
void init(int N, int durableTime, int deliveryTimes[MAXN])
{
    maxRideTime = durableTime;
    hashUser.clear();
    for (int i = 0; i < N; i++)
    {
        S[i].deliverTime = deliveryTimes[i];
        S[i].newBike = 0;
        S[i].bikeDeliver = queue<int>();
        S[i].bikeUsed = priority_queue<Bike> ();
    }
    uID = 0;
}
 
void addBicycle(int cTimestamp, int pID, int bicycleNum)
{
    S[pID].newBike += bicycleNum;
}
 
void buyTicket(int cTimestamp, char uName[MAXL], int validTime)
{
    int uid = hashUser[uName];
    if (uid == 0) // chưa có user -> tạo user
    {
        uID++;
        uid = uID;
        hashUser[uName] = uid;
        user[uid].rentStart = 0;
        user[uid].ticketEnd = 0;
    }
    if (user[uid].ticketEnd > cTimestamp) user[uid].ticketEnd += validTime;
    else user[uid].ticketEnd = cTimestamp + validTime;
}
 
int rentBicycle(int cTimestamp, char uName[MAXL], int pID)
{
    int uid = hashUser[uName];
    if (/*uid == 0 ||*/ user[uid].ticketEnd <= cTimestamp || user[uid].rentStart != 0) return -1;
    //auto &s = S[pID];
    if (S[pID].newBike > 0)
    {
        S[pID].newBike--;
        user[uid].durability = maxRideTime;
    }
    else if (!S[pID].bikeDeliver.empty() && S[pID].bikeDeliver.front() <= cTimestamp)
    {
        S[pID].bikeDeliver.pop();
        user[uid].durability = maxRideTime;
    }
    else
    {
        if (S[pID].bikeUsed.empty()) return -1;
        Bike b(S[pID].bikeUsed.top());
        S[pID].bikeUsed.pop();
        user[uid].durability = b.timeUsed;
    }
    user[uid].rentStart = cTimestamp;
    return maxRideTime - user[uid].durability;
}
 
int returnBicycle(int cTimestamp, char uName[MAXL], int pID)
{
    int uid = hashUser[uName];
    if (uid == 0 || user[uid].rentStart == 0) return -1;
    auto &u = user[uid];
    int overdue = cTimestamp - u.ticketEnd + 1;
    int durableLeft = u.durability - (cTimestamp-u.rentStart);
    auto &s = S[pID];
    if (durableLeft < 0)
    {
        s.bikeDeliver.push(cTimestamp + s.deliverTime);
    }
    else
    {
        Bike b = {durableLeft};
        s.bikeUsed.push(b);
    }
    u.rentStart = 0;
    if (overdue < 0) overdue = 0;
    return overdue;
	return 0;
}
////////////////////////////////////////////
#define MAXN		100
#define MAXL		8
#include<unordered_map>
#include<queue>
#include<string>
using namespace std;

struct user{
	int ticket_end;
	int rent_start;
	int durability;
};
struct Bike
{
    int timeUsed;
    bool operator < (const Bike &other) const {return timeUsed < other.timeUsed;}
};
struct station{
	int deliver_time;
	int new_bike;
	queue<int> bike_deliver;
	priority_queue<Bike> bike_user;
};
station Sta[105];
user User[10005];
unordered_map<string,int> map_user;
int idx;
int max_TimeRide;
void init(int N, int durableTime, int deliveryTimes[MAXN])
{
	idx=0;
	map_user.clear();
	max_TimeRide = durableTime;
	for(int i=0;i<N;i++)
	{
		Sta[i].deliver_time=deliveryTimes[i];
		Sta[i].new_bike=0;
		Sta[i].bike_user = priority_queue<Bike>();
		Sta[i].bike_deliver = queue<int>();
	}

}

void addBicycle(int cTimestamp, int pID, int bicycleNum)
{
	Sta[pID].new_bike+=bicycleNum;
}

void buyTicket(int cTimestamp, char uName[MAXL], int validTime)
{
	int id =map_user[uName];
	if (id==0) 
	{
		idx++;
		map_user[uName] = idx;
		User[idx].rent_start = 0;
		User[idx].ticket_end = 0;
	}
	if (User[idx].ticket_end > cTimestamp) 
	{
		User[idx].ticket_end+= validTime;
	}
	else 
		User[idx].ticket_end = cTimestamp + validTime;
}

int rentBicycle(int cTimestamp, char uName[MAXL], int pID)
{
	int id = map_user[uName];
	if(id==0||User[id].ticket_end<=cTimestamp || User[id].rent_start!=0) return -1;
	if(Sta[pID].new_bike>0) // Neu con xe moi
	{
		Sta[pID].new_bike--;
		User[id].durability=max_TimeRide;
	}
	else if(!Sta[pID].bike_deliver.empty() && Sta[pID].bike_deliver.front()<=cTimestamp)//neu xe moi da ve
	{
		Sta[pID].bike_deliver.pop();
		User[id].durability=max_TimeRide;
	}
	else {
		if(Sta[pID].bike_user.empty()) return -1;//neu danh sach xe rong
		Bike b = Sta[pID].bike_user.top();
		Sta[pID].bike_user.pop();
		User[id].durability = b.timeUsed;
	}
	User[id].rent_start=cTimestamp;
	return max_TimeRide-User[id].durability;
	
}

int returnBicycle(int cTimestamp, char uName[MAXL], int pID)
{
	int id = map_user[uName];
	if(id==0 || User[id].rent_start==0) return -1;
	if(User[id].ticket_end>cTimestamp) return 0;
	
    int overdue = cTimestamp - User[id].ticket_end + 1;
	int durableLeft = User[id].durability - (cTimestamp-User[id].rent_start);
   
    if (durableLeft < 0)
    {
		Sta[pID].bike_deliver.push(cTimestamp + Sta[pID].deliver_time);
    }
    else
    {
		 Bike b = {durableLeft};
		Sta[pID].bike_user.push(b);
    }
	User[id].rent_start = 0;
    if (overdue < 0) overdue = 0;
    return overdue;
	return 0;
}