Olimpiada Judeteana de Informatica 2019. Rezolvare problema „Cartele” in C++, clasa a V-a

Mai jos veti gasi problema „Cartele” data la Olimpiada Judeteana de Informatica in anul 2019 la clasa a V-a, iar dupa textul problemei veti gasi si rezolvarea mea.

Problema Aur:

Intr-o scoala exista un sistem de acces cu ajutorul cartelelor, conectat la un calculator si o imprimanta. Fiecare elev al scolii are cate o cartela. Intr-o zi, la utilizarea fiecarei cartele, sistemul imprima urmatoarele informatii pe hartie, pe cate o linie, dupa regula urmatoare:
– Caracterul b daca elevul este baiat sau caracterul f daca este fata. Caracterul va fi urmat de un spatiu;
– Caracterul i daca elevul a intrat ın scoala sau caracterul e daca a iesit din scoala. De asemenea, acest caracter va fi urmat de un spatiu;
– Momentul utilizarii cartelei, exprimat prin ora, minute si secunde. Acestea vor fi reprezentate ın cadrul liniei, exact ın aceasta ordine, prin trei numere naturale, separate ıntre ele prin cate un spatiu.

Cerinte:

Cunoscandu-se toate cele N linii imprimate ıntr-o zi determinati:

  1. Cati baieti si cate fete sunt la scoala dupa cele N actiuni imprimate de sistem.
  2. Care este numarul total de secunde ın care, ın scoala, s-au aflat un numar egal, nenul, de fete si baieti, pana ın momentul utilizarii ultimei cartele. Daca nu exista aceasta situatie se afiseaza 0.
  3. Care este numarul maxim de secunde ın care, ın scoala, pana ın momentul utilizarii ultimei cartele, s-au aflat neıntrerupt un numar impar de baieti. Daca nu exista o astfel de situatie se afiseaza 0.

Date de intrare:

Fisierul de intrare cartele.in contine pe prima linie un numar natural C reprezentand numarul cerintei care poate avea valorile 1, 2 sau 3, pe a doua linie numarul natural N, iar pe urmatoarele N linii informatiile imprimate de sistem sub forma descrisa in enunt, in ordinea strict crescatoare a momentului folosirii cartelei.

Date de iesire: 

Daca C = 1, atunci fisierul de iesire cartele.out va contine, in aceasta ordine, separate printr-un spatiu, numarul de baieti si numarul de fete determinat conform cerintei 1.
Daca C = 2 sau C = 3, atunci fisierul de iesire cartele.out va contine pe prima linie un singur numar natural ce reprezinta rezultatul determinat conform cerintei.

Restrictii si precizari:

  1. 1 <= N <= 10000.
  2. La momentul utilizarii primei cartele, in scoala nu se afla niciun elev.
  3. Sistemul de acces nu permite folosirea simultana a doua cartele.
  4. Pentru orice linie imprimata de sistem 0 <= ora <= 23, 0 <= minute <= 59 si 0 <= secunde <= 59.
  5. Pe fiecare linie a fisierului de intrare, dupa ultimul numar, reprezentand secundele, nu exista spatiu.
  6. Pentru rezolvarea corecta a primei cerinte se acorda 20 de puncte, pentru rezolvarea corecta a celei de-a doua cerinte se acorda 30 de puncte iar pentru rezolvarea corecta a celei de-a treia cerinte se acorda 40 de puncte.

Exemplul 1:

cartele.in:
1
3
b i 0 0 24
f i 0 0 26
b e 0 0 29

cartele.out:
0 1

Explicatii:

Se rezolva cerinta 1. Un baiat a intrat la momentul 0 0 24 (adica ora 0, minutul 0 si secunda 24) si iesit la momentul 0 0 29. O fata a intrat la momentul 0 0 26.
Dupa cele 3 actiuni, in scoala a ramas o fata.
Numarul cifrelor scrise de Tˆandala este 12.


Exemplul 2:

cartele.in:
2
8
f i 8 19 10
b i 8 19 12
b e 8 19 15
b i 8 20 0
b e 8 20 4
b i 8 20 10
b i 8 20 50
b i 8 20 51

cartele.out:
47

Explicatii:

Se rezolva cerinta 2.
Intre momentele 8 19 12 si 8 19 15 in scoala se afla 1 baiat si 1 fata, deci durata este 3 secunde.
Intre momentele 8 20 0 si 8 20 4 in scoala se afla 1 baiat si 1 fata, deci durata este 4 secunde.
Intre momentele 8 20 10 si 8 20 50 in scoala se afla 1 baiat si 1 fata, deci durata este 40 de secunde.
Durata totala este 3+4+40=47 de secunde.


Exemplul 3:

cartele.in:
3
9
f i 8 19 10
b i 8 19 12
f e 8 19 13
b e 8 19 15
b i 8 20 0
b e 8 20 1
b i 8 20 10
b i 8 20 12
b i 8 20 13

cartele.out:
3

Explicatii:

Se rezolva cerinta 2.
Intre momentele 8 19 12 si 8 19 15 in scoala se afla 1 baiat, deci durata este 3 secunde.
Intre momentele 8 20 0 si 8 20 1 in scoala se afla 1 baiat, deci durata este 1 secunda.
Intre momentele 8 20 10 si 8 20 12 in scoala se afla 3 baieti, deci durata este 2 secunde.
Durata maxima ceruta este de 3 secunde.


Mai jos veti gasi metoda mea de rezolvare a problemei:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;


int main()
{
    ifstream f("cartele.in");
    ofstream g("cartele.out");
    short int C;
    f >> C;
    if (C == 1) {
        int girls = 0, boys = 0;
        char bf, ie;
        int nr, h, m, s;
        f >> nr;
        for (int i = 1; i <= nr; i++) {
            f >> bf >> ie >> h >> m >> s;
            if (bf == 'f') {
                if (ie == 'e')
                    girls--;
                else
                    girls++;
            }
            else {
                if (ie == 'e')
                    boys--;
                else
                    boys++;
            }
        }
        g << boys << " " << girls;
    }
    if (C == 2) {
        int girls = 0, boys = 0;
        char bf, ie;
        int nr, time1, time2, h, m, s, timp_total = 0;
        f >> nr;
        for (int i = 1; i <= nr; i++) {
            f >> bf >> ie >> h >> m >> s;
            bool era_egal = false;
            if (girls != 0 && girls == boys)
                era_egal = true;
            if (bf == 'f') {
                if (ie == 'e')
                    girls--;
                else
                    girls++;
            }
            else {
                if (ie == 'e')
                    boys--;
                else
                    boys++;
            }
            if (i == 1) {
                time1 = 0;
                time1 += h * 3600;
                time1 += m * 60;
                time1 += s;
            }
            else {
                time2 = 0;
                time2 += h * 3600;
                time2 += m * 60;
                time2 += s;
                if (era_egal)
                    timp_total += time2 - time1;
                time1 = time2;
            }
        }
        g << timp_total;
    }
    if (C == 3) {
        int boys = 0, nr, time1 = 0, time2, timp_maxim = 0;
        char bf, ie;
        int h, m, s;
        f >> nr;
        for (int i = 1; i <= nr; i++) {
            f >> bf >> ie >> h >> m >> s;
            bool era_impar = false;
            if (boys % 2 == 1)
                era_impar = true;
            if (bf == 'b') {
                if (ie == 'e')
                    boys--;
                else
                    boys++;
            }
            if (boys % 2 == 1 && time1 == 0) {
                time1 += h * 3600;
                time1 += m * 60;
                time1 += s;
            }
            else {
                time2 = 0;
                time2 += h * 3600;
                time2 += m * 60;
                time2 += s;
                if (era_impar && boys % 2 == 0) {
                    if (time2 - time1 > timp_maxim)
                        timp_maxim = time2 - time1;
                    time1 = 0;
                }
            }
        }
        g << timp_maxim;
    }
}

Sper sa va fie de folos. 😉

Daca aveti intrebari, va rog sa lasati un mesaj mai jos in comentarii.

Ma numesc Sebastian, am 10 ani si sunt pasionat de: programare in Python, C++, Raspberry Pi, citit, astronomie, astrofizica, chimie, sport, fotografie si Xbox. Ma gasesti si pe: Instagram, Youtube, Facebook

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *