Untitled

 avatar
unknown
plain_text
5 months ago
3.0 kB
2
Indexable
#include <iostream>
#include <unordered_set>
#include <queue>
#include <cstring>
#include <unordered_map>
using namespace std;
struct cmp {
    bool operator()(const int& a, const int& b) const {
        // Custom comparison logic here
        return a > b; // Example: Compare in descending order
    }
};
struct node {
    int seat[101];
    int avail;
} theatre[2001];
   
int visit[101];
   
unordered_map <int, int> m;
struct Result {
    int id;
    int num;
};
int n = 0;
   
int dir[4] = { 1,-1,10,-10 };
   
void init(int N)
{
    n = N;
    m.clear();
    for (int i = 1; i <= n; i++)
    {
        theatre[i].avail = 100;
        for (int j = 1; j < 101; j++)
        {
            theatre[i].seat[j] = 0;
        }
    }
    memset(visit, 0, sizeof(visit));
}
   
bool bfs(int tid, int seat, int k, int mid)
{
    int booked[101];
    memset(booked, 0, sizeof(booked));
    priority_queue <int, vector<int>, cmp> pq;
    pq.push(seat);
    booked[seat] = 1;
    int cnt = 0;
    while (!pq.empty())
    {
        int currSeat = pq.top();
        pq.pop();
        booked[currSeat] = 1;
        cnt++;
        if (cnt == k)
            break;
        for (int d = 0; d < 4; d++)
        {
            int nextSeat = currSeat + dir[d];
            if (currSeat % 10 == 0 && dir[d] == 1)
                continue;
            if (currSeat % 10 == 1 && dir[d] == -1)
                continue;
            if (visit[nextSeat] == 0 && booked[nextSeat] == 0 && theatre[tid].seat[nextSeat] == 0 && (nextSeat > 0 && nextSeat < 101))
            {
                pq.push(nextSeat);
                visit[nextSeat] = 1;
            }
        }
    }
    if (cnt == k)
    {
        for (int i = 1; i < 101; i++)
        {
            if (booked[i] == 1)
            {
                theatre[tid].seat[i] = mid;
            }
        }
        return true;
    }
    return false;
}
Result reserveSeats(int mID, int K)
{
    Result res;
    for (int i = 1; i <= n; i++)
    {
        if (theatre[i].avail >= K)
        {
            memset(visit, 0, sizeof(visit));
            for (int j = 1; j < 101; j++)
            {
                if (visit[j] == 0 && theatre[i].seat[j] == 0 && bfs(i, j, K, mID))
                {
                    theatre[i].avail -= K;
                    m[mID] = i;
                    res.id = i;
                    res.num = j;
                    return res;
                }
            }
        }
    }
    res.id = 0;
    res.num = 0;
    return res;
}
    
Result cancelReservation(int mID)
{
    int sum = 0;
    int tid = m[mID];
    int cnt = 0;
    for (int i = 1; i < 101; i++)
    {
        if (theatre[tid].seat[i] == mID)
        {
            sum += i;
            theatre[tid].seat[i] = 0;
            cnt++;
        }
    }
    m[mID] = 0;
    theatre[tid].avail += cnt;
    Result res;
    res.id = tid;
    res.num = sum;
    return res;
}
Editor is loading...
Leave a Comment