Cod sursa(job #2550282)

Utilizator LazarRazvanLazar Razvan LazarRazvan Data 18 februarie 2020 18:01:03
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
/**
 * InfoArena
 * problema Hotel
 * Varianta ineficienta, vector
 */

#include <iostream>
#include <fstream>

#define MAXROOMS 100001

using namespace std;

ifstream fin;
ofstream fout;

int n, p;   //nr of rooms, nr of instructions
int type;   // 1/2/3 depending on the instruction given

int rooms[MAXROOMS];    /* -1 if the room is busy; 1 <= x <= n if the room is empty
                         *  x = the number of consecutive available rooms starting with the current room
                         */

void initRooms()
{
    rooms[0] = -1;
    rooms[n+1] = -1;

    for (int i=1; i<=n; i++)
    {
        rooms[i] = n - i + 1;
    }
}

void checkRooms()       //debugging function
{
    for (int i=1; i<=n; i++)
        cout << rooms[i] << " ";

    cout << '\n';
}

void fill(int start, int nrConsStart)
{
    int i = start, nrCons = nrConsStart;

    while(rooms[i] != -1)
    {
        rooms[i] = nrCons;
        nrCons++;
        i--;
    }
}

void set1(int firstRoom, int nrMembers)     //group comes
{
    for (int i=firstRoom; i<=firstRoom + nrMembers - 1; i++)
    {
        rooms[i] = -1;
    }

    fill(firstRoom-1, 1);

}

void set2(int firstRoom, int nrMembers)     //group leaves
{
    for (int i=firstRoom + nrMembers - 1; i>=firstRoom; i--)
    {
        if(rooms[i+1] != -1)
            rooms[i] = rooms[i+1] + 1;
        else rooms[i] = 1;
    }

    fill(firstRoom - 1, rooms[firstRoom] + 1);

}

void set3()                                 //manager's question
{
    int maxCons = 0;
    for (int i=1; i<=n; i++)
    {
        if (rooms[i] > maxCons)
            maxCons = rooms[i];
    }

    fout << maxCons << '\n';
}

int main() {

    fin.open("hotel.in");
    fout.open("hotel.out");

    fin >> n >> p;

    initRooms();



    for (int instruction=1; instruction<=p; instruction++)
    {
        fin >> type;

        checkRooms();

        if (type == 1) {

            int firstRoom, nrMembers;
            fin >> firstRoom >> nrMembers;

            set1(firstRoom, nrMembers);
        }

        if (type == 2){
            int firstRoom, nrMembers;
            fin >> firstRoom >> nrMembers;

            set2(firstRoom, nrMembers);
        }

        if (type == 3) {
            set3();
        }

    }

    fin.close();
    fout.close();

    return 0;
}