Rezolvare completă PbInfo #2899 timbre

Vasilică a devenit filatelist pasionat. Din acest motiv toți prietenii i-au adus de ziua lui timbre, foarte multe timbre. Acum încearcă să organizeze timbrele primite. Fiecare timbru face parte dintr-o serie și are o valoare. Timbre distincte din aceeași serie au valori distincte. Este posibil ca Vasilică să fi primit și dubluri (adică să fi primit același timbru de mai multe ori). Valoarea unei serii este egală cu suma valorilor timbrelor distincte din seria respectivă. Dublurile nu contribuie la valoarea seriei, dar Vasilică le poate folosi pentru a face schimb de timbre cu alți filateliști.

Cerința

Cunoscând lista timbrelor primite, scrieți un program care să rezolve următoarele cerințe:
1. determină numărul de serii distincte din care fac parte timbrele primite;
2. determină numărul de timbre unicat (care nu au dublură);
3. determină seriile cu cea mai mare valoare.

Date de intrare

Fișierul de intrare timbre.in conţine pe prima linie cerinţa care trebuie să fie rezolvată (1, 2 sau 3). Pe a doua linie se află un număr natural N, reprezentând numărul de timbre primite de Vasilică. Pe fiecare dintre următoarele N linii este descris câte un timbru sub forma serie valoare, unde serie reprezintă denumirea seriei din care face parte timbrul respectiv, iar valoare este un număr reprezentând valoarea timbrului respectiv; seria și valoarea sunt separate printr-un singur spațiu.

Date de ieșire

Dacă cerința este 1 sau 2, fișierul de ieșire timbre.out va conține pe prima linie un număr reprezentând răspunsul la cerința respectivă. Dacă cerința este 3, fișierul de ieșire timbre.out va conține denumirile seriilor cu valoarea cea mai mare, câte o denumire pe o linie, în ordine lexicografică.

Restricții și precizări

  • 1 ≤ N ≤ 100
  • Valorile timbrelor sunt numere naturale nenule mai mici sau egale cu 1000.
  • Denumirile seriilor sunt formate din cel mult 50 de caractere (litere, cifre, spațiu, cratimă).
  • Pentru fiecare cerință se acordă 30% din punctajul obținut pe teste.

Exemplul 1:

timbre.in

1
9
Cap-de-bour 4
Romania 100 10
Cap-de-bour 7
Cap-de-bour 4
Romania 100 5
Romania 100 5
Romania 100 5
CRACIUN 2018 15
Romania 100 10

timbre.out

3

Explicație

Există trei serii distincte (Cap-de-bour, Romania 100 și CRACIUN 2018).

Exemplul 2:

timbre.in

2
9
Cap-de-bour 4
Romania 100 10
Cap-de-bour 7
Cap-de-bour 4
Romania 100 5
Romania 100 5
Romania 100 5
CRACIUN 2018 15
Romania 100 10

timbre.out

2

Explicație

În aceste serii există doar două timbre unicat (timbrul cu valoarea 7 din seria Cap-de-bour și cel din seria CRACIUN 2018).

Exemplul 3:

timbre.in

3
9
Cap-de-bour 4
Romania 100 10
Cap-de-bour 7
Cap-de-bour 4
Romania 100 5
Romania 100 5
Romania 100 5
CRACIUN 2018 15
Romania 100 10

timbre.out

CRACIUN 2018
Romania 100

Explicație

Seriile având valoarea cea mai mare (15) sunt (în ordine lexicografică) CRACIUN 2018 și Romania 100.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema timbre:

#include <fstream>
#include <stdlib.h>
#include <vector>
#include <utility>
#include <cstring>
#include <string>
#include <algorithm>
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define NMAX 101
#define LMAX 60
#define MAX(a,b) (a)>(b)?(a):(b)

using namespace std;
ifstream fin("timbre.in");
ofstream fout("timbre.out");

struct timbru
{
    char serie[LMAX];
    vector<pii>valori;
    int valoare;
};
vector<string>rez;
timbru timbre[NMAX];
int nrt;
int cerinta, n;
char t[LMAX];
int lg, valoare;
bool gasit, dublura;

void c1();
void c2();
void c3();

int main()
{
    char ch;
    fin>>cerinta;
    fin>>n;
    fin.get(ch);
    for (int i=0;i<n;++i)
    {
        fin.getline(t, LMAX);
        lg = strlen(t);
        for (int j=lg-1;j>=0;--j)
        {
            if (t[j] == ' ')
            {
                t[j] = 0;
                valoare = atoi(t+j+1);
                break;
            }
        }
        gasit = false;
        for (int j=0;j<nrt;++j)
        {
            if (!strcmp(timbre[j].serie, t))
            {
                gasit = true;
                dublura = false;
                for (int k=0;k<timbre[j].valori.size();++k)
                {
                    if(timbre[j].valori[k].first == valoare)
                    {
                        ++timbre[j].valori[k].second;
                        dublura = true;
                        break;
                    }
                }
                if (!dublura)
                {
                    timbre[j].valori.pb(mp(valoare, 1));
                    timbre[j].valoare += valoare;
                }
                break;
            }
        }
        if (!gasit)
        {
            strcpy(timbre[nrt].serie, t);
            timbre[nrt].valori.pb(mp(valoare, 1));
            timbre[nrt].valoare += valoare;
            ++nrt;
        }
    }
    switch(cerinta)
    {
    case 1:
        c1();
        break;
    case 2:
        c2();
        break;
    case 3:
        c3();
        break;
    default:
        break;
    }
    fin.close();
    fout.close();
    return 0;
}

void c1()
{
    fout<<nrt<<'\n';
}
void c2()
{
    int af = 0;
    for (int i=0;i<nrt;++i)
    {
        for(int j=0;j<timbre[i].valori.size();++j)
        {
            if (timbre[i].valori[j].second == 1)
            {
                ++af;
            }
        }
    }
    fout<<af<<'\n';
}
void c3()
{
    int vMax = 0;
    for (int i=0;i<nrt;++i)
    {
        vMax = MAX(vMax, timbre[i].valoare);
    }
    for (int i=0;i<nrt;++i)
    {
        if (timbre[i].valoare == vMax)
        {
            string act(timbre[i].serie);
            rez.pb(act);
        }
    }
    sort(rez.begin(), rez.end());
    for (auto x:rez)
    {
        fout<<x<<'\n';
    }
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2899 timbre

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2899 timbre de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!