# PBinfo #4346 – autoruz – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Ruz deține un parc de autoturisme. În parcul său toate mașinile sunt stocate într-o bază de date din propriul calculator și sunt identificate după trei elemente m, nr și p, unde m reprezintă marca autoturismului, nr reprezintă numărul de înmatriculare al autoturimului, iar p reprezintă prețul de vânzare. El dorește să dezvolte o aplicație pentru a afla în orice moment care este numărul de mașini înmatriculate în județul Iași, marca mașinii care are prețul maxim, respectiv care este valoarea parcului de autoturisme.

Cerința
Scrieţi un program care să determine:
1) numărul de mașini din județul Iași, având codul IS.
2) marca mașinii cu prețul maxim.
3) valoarea parcului de autoturisme.

Date de intrare
Fișierul de intrare autoruz.in conţine pe prima linie cerința 1, 2 sau 3. Pe a doua linie numărul n, reprezentând numărul total de mașini din parcul auto, iar pe următoarele n linii vor fi cele trei elemente de identificare ale fiecărui autoturism, separate printr-un spațiu.

Date de ieșire
Fișierul de ieșire autoruz.out va conține o singură linie pe care va fi scris:
- cerința 1: numărul de autoturisme din județul Iași, având codul IS.
- cerința 2: marca mașinii cu prețul maxim.
- cerința 3: un număr reprezentând valoarea parcului de autoturisme.

Restricții și precizări

n este număr natural, 1 ≤ n ≤ 1024;
m, șir de maximum 11 caractere alfabetice (litere mari și mici);
nr, șir de caractere de forma JJCCLLL, unde JJ sunt două litere mari reprezentând județul, CC sunt două cifre, LLL reprezintă o combinație de litere mari.
p, număr natural cu cel mult 55 de cifre;
pentru cerința 2, dacă sunt mai multe mărci de autoturisme cu aceeași valoare maximă, atunci se va afișa prima din ordinea lexicografică a mărcii.
pentru 30% din teste numărul natural p va fi: 0 ≤ p ≤ 1024.

Exemplul 1:
autoruz.in

1
4
Chevrolet IS88ALN 700
Volvo VS11QQQ 22222
BMW IS01ABC 3210
BMW BT33AAA 22222
autoruz.out

2
Explicație
Din județul Iași Ruz deține 2 autoturisme.

Exemplul 2:
autoruz.in

2
4
Chevrolet IS88ALN 700
Volvo VS11QQQ 22222
BMW IS01ABC 3210
BMW BT33AAA 22222
autoruz.out

BMW
Explicație
Marca mașinii cu prețul maxim 22222 este BMW, prima din ordinea lexicografică a mărcii.

Exemplul 3:
autoruz.in

3
4
Chevrolet IS88ALN 700
Volvo VS11QQQ 22222
BMW IS01ABC 3210
BMW BT33AAA 22222
autoruz.out

48354
Explicație
Valoarea parcului auto.

## Cod sursă C++

```cpp
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("autoruz.in");
ofstream fout("autoruz.out");
int comparare(int x[], int y[])
{
    while (x[0]>1 && x[x[0]]==0) x[0]--;
    while (y[0]>1 && y[y[0]]==0) y[0]--;
    if (x[0]!=y[0])
        return (x[0]<y[0]?-1:1);
    else
    {
        int c=x[0];
        while (x[c]==y[c] && c>0) c--;
        if (c==0)
            return 0;
        else
            return (x[c]<y[c]?-1:1);
    }
}
void init_mare(int nrMARE_d[], int nrMARE_s[])
{
    for(int i=0; i<=nrMARE_s[0]; i++)
        nrMARE_d[i] = nrMARE_s[i];
}
void afisare(int nrMARE[])
{
    for(int i=nrMARE[0]; i>=1; i--)
        fout << nrMARE[i];
}
void suma(int x[], int y[], int s[])
{
    int lg = (x[0]>=y[0]?x[0]:y[0]);
    int t = 0;
    for(int i=x[0]+1; i<=lg; i++) x[i]=0;
    for(int i=y[0]+1; i<=lg; i++) y[i]=0;
    s[0]=lg;
    for(int i=1; i<=lg; i++)
    {
        s[i] = x[i] + y[i] + t;
        t    = s[i]/10;
        s[i] = s[i]%10;
    }
    if (t==1)
        s[++s[0]]=1;
}
int cerinta, n;
char m[12], nr[8], p[56];
int main()
{
    fin >> cerinta;
    if (cerinta==1)
    {
        int autoIS=0;
        int i;
        fin >> n;
        for(i=1; i<=n; i++)
        {
            fin >> m >> nr >> p;
            fin.get();
            if (nr[0]=='I' && nr[1]=='S')
                autoIS++;
        }
        fout << autoIS++;
    }
    if (cerinta==2)
    {
        int i, j;
        int P[56], maxP[56];
        char marca[12];          // marca masinii cu pretul maxim
        fin >> n;
        // prima masina
        fin >> m >> nr >> p;
        fin.get();
        strcpy(marca, m);
        maxP[0] = strlen(p);
        for(j=0; p[j]; j++)
            maxP[maxP[0]-j] = p[j] - '0';
        // restul masinilor
        for(i=2; i<=n; i++)
        {
            fin >> m >> nr >> p;
            fin.get();
            P[0] = strlen(p);
            for(j=0; p[j]; j++)
                P[P[0]-j] = p[j] - '0';
            if (comparare(P, maxP)==1)      // algoritm maxim
            {
                init_mare(maxP, P);
                strcpy(marca, m);
            }
            else
                if (comparare(P, maxP)==0)
                    if (strcmp(marca,m)>0)  // lexicografic
                        strcpy(marca, m);
        }
        //afisare(maxP);
        fout << marca;
    }
    if (cerinta==3)
    {
        int i, j;
        int P[61];
        int sumPartiala[61];
        int sumFinala[61];
        sumFinala[0]=1;
        fin >> n;
        fin >> m >> nr >> p;
        fin.get();
        P[0] = strlen(p);
        for(j=0; p[j]; j++)
            P[P[0]-j] = p[j] - '0';
        init_mare(sumPartiala,P);
        if (n==1)
            init_mare(sumFinala,P);
        for(i=2; i<=n; i++)
        {
            fin >> m >> nr >> p;
            fin.get();
            P[0] = strlen(p);
            for(j=0; p[j]; j++)
                P[P[0]-j] = p[j] - '0';
            suma(P, sumPartiala, sumFinala);
            init_mare(sumPartiala, sumFinala);
        }
        afisare(sumFinala);
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4346)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4346/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4346/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
