Rezolvare completă PbInfo #853 Cadouri

Cerința

Elevii clasei a X-a s-au implicat în strângerea de cadouri pentru Crăciun. Fiecare elev a adus mai multe cadouri, și a trimis prin email șefului clasei o urare, însoțită de lista cadourilor. Fiecare email are forma:
urare lista_cadouri
urare este un text care nu conţine cifre. Lista cadourilor constă într-o enumerare a cadourilor:
numar_cadouri denumire_cadou
(numar_cadouri este un număr natural, iar denumire_cadou este un cuvânt scris cu litere mici ale alfabetului englez; numar_cadouri şi denumire_cadou sunt separate prin cel puţin un spaţiu), cadourile din listă fiind separate prin spaţii şi/sau diverse semne de punctuaţie

Şeful clasei trebuie să centralizeze listele primite. Ajutaţi-l să construiască o listă a care să conţină denumirea fiecărui cadou şi numărul total de cadouri de acel tip (cantitatea). Lista va fi ordonată descrescător după cantitate.

Date de intrare

Fișierul de intrare cadouri.in conține pe prima linie numărul n de elevi din clasa a X-a; fiecare dintre următoarele n linii, conţine câte un email.

Date de ieșire

Fișierul de ieșire cadouri.out va conține pe prima linie numărul de cadouri diferite C; următoarele C linii vor conţine câte un cadou şi cantitatea totală, separate prin exact un spaţiu. Lista cadouri va fi ordonată descrescător după cantitate. Dacă există mai multe cadouri cu aceeaşi cantitate, se va afişa mai întâi cadoul cu denumirea mai mică din punct de vedere lexicografic.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • fiecare linie a fişierului de intrare conţine cel mult 255 caractere
  • sunt cel mult 500 de cadouri diferite cu denumirea de cel mult 20 de litere ale afabetului englez
  • cantitatea din fiecare cadou este cel mult 100.000

Exemplu

cadouri.in

3
La multi ani! 4 papusi, 15 ciocolate , 20 sosete.
Sarbatori fericite :) ! 3 ciocolate , 10 biscuiti, 5 papusi
Salut. 2 ciocolate , 1 papusi. 1 ciocolate!

cadouri.out

4
ciocolate 21
sosete 20
biscuiti 10
papusi 10

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 Cadouri:

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

ifstream fin("cadouri.in");
ofstream fout("cadouri.out");

int n, cantitate[505];
char denumire[505][21];

bool cifra(char X)
{
    return X >= '0' && X <= '9';
}

bool litera_mica(char X)
{
    return X >= 'a' && X <= 'z';
}

int main()
{
    int m;
    char email[256];
    char p[21];
    fin >> m;
    fin.getline(email , 256);
    for( ; m ; m --)
    {
        fin.getline(email , 256);
        int lg = strlen(email); //vom distruge sirul
        for(int i = 0 ; i < lg ; i ++)
            if( cifra( email[i]) )
            {
                int cnt = 0;
                while(cifra(email[i]))
                {
                    cnt = 10 * cnt + email[i] - '0';
                    i ++;
                }
                while(email[i] == ' ')
                    i ++;
                int j = i;
                while(litera_mica(email[i]))
                    i ++;
                email[i] = 0;
                strcpy(p , email + j);
                int poz = -1;
                for(int i = 0 ; i < n && poz == -1 ; i ++)
                    if(strcmp(denumire[i] , p) == 0)
                        poz = i;
                if(poz != -1)
                    cantitate[poz] += cnt;
                else
                {
                    strcpy(denumire[n] , p);
                    cantitate[n] = cnt;
                    n ++;
                    
                }
                
            }
    }
    
    for (int i = 0 ; i < n - 1 ; i ++)
        for(int j = i + 1 ; j < n ; j ++)
            if(cantitate[i] < cantitate[j])
            {
                int aux = cantitate[i]; cantitate[i] = cantitate[j] ; cantitate[j] = aux;
                strcpy(p , denumire[i]); strcpy(denumire[i], denumire[j]); strcpy(denumire[j] , p);
            }
            else
                if(cantitate[i] == cantitate[j])
                    if(strcmp(denumire[i] , denumire[j]) > 0)
                    {
                        strcpy(p , denumire[i]); strcpy(denumire[i], denumire[j]); strcpy(denumire[j] , p);
                    }
    fout << n << "\n";
    for(int i = 0 ; i < n ; i ++)
        fout << denumire[i] << " " << cantitate[i] << "\n";
    return 0;
    
}

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 #853 Cadouri

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #853 Cadouri 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!