Rezolvare completă PbInfo #1953 tabel1

Cerința

Marius se pregătește pentru olimpiada de informatică. Astăzi, profesoara lui i-a predat șirurile de caractere. După școală și-a lăsat caietul de informatică pe birou, și frățiorul lui, pus pe șotii, a deschis caietul la ultima lecție și a văzut scris mare: TABEL ASCII. Pentru că îi place să scrie, s-a gândit să modifice puțin numerele din tabel. Așa că a șters unele din ele, scriind altele în loc. Marius nu a observat acest lucru și a început să rezolve problemele date de doamna profesoară. Are nevoie de ajutor, de aceea te roagă să îl ajuți să rezolve următoarea problemă, folosind tabelul ascii din caietul său: “Se dă un șir de caractere format din cifre și litere mari și mici ale alfabetului englez. Afișați suma valorilor tuturor literelor (valoarea unei litere se află în tabelul Ascii) și cel mai mare număr vale-deal care se poate forma cu cifrele care apar în șir. Un număr vale-deal are cifre distincte și cifrele din prima jumătate sunt în ordine descrescătoare, iar dele din a doua jumătate în ordine crescătoare. Exemplu : 98367 e număr vale-deal, 998367 nu e număr vale-deal, 987 nu e număr vale-deal.”

Cunoscând șirul format din cifre zecimale, litere mici și litere mari ale alfabetului englez, respectiv numerele modificate de fratele lui Marius, scrieți un program care să determine:

a) suma codurilor ASCII ale literelor din sir (folosind tabelul din caietul lui Marius);
b) cel mai mare număr vale-deal care are cifre ce apar în șir.

Date de intrare

Fișierul tabel1.in conține:

  • pe prima linie un număr natural n, ce reprezintă numărul de valori modificate de fratele lui Marius;
  • pe următoarele linii n perechi x yx este caracterul ce are valoarea y în tabelul ascii
  • pe linia n + 2 un şir format din litere și cifre;

Date de ieșire

Fișierul de ieșire tabel1.out va conține:

  • pe prima linie suma literelor din șir;
  • pe a doua linie numărul vale-deal cu proprietățile enumerate în enunț.

Restricții și precizări

  • Şirul dat este format din cel mult 1000000 de litere şi cifre
  • Fratele lui Marius scrie numere naturale distincte nenule mai mici decât 65
  • 0 <= n <= 50

Exemplu

tabel1.in

4
a 1
b 2
e 3
l 4
tabel1234apa543216

tabel1.out

240
654123

Explicație

a) suma literelor e : 116(t) + 1(a) + 2(b) + 3(e) + 4(l) + 1(a) + 112(p) + 1(a) = 240
b) cifrele care apar sunt: 1, 2, 3, 4, 5, 6 și numărul vale-deal cu valoare maxima e 654123

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

#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("tabel1.in");
ofstream g ("tabel1.out");

int val['z' + 1],apare[12],n,k,j,s,i,y;
char x;

int main()
{
    f >> n;
    for(i = 1; i <= n; i++)
    {
        f >> x >> y;
        val[x] = y;
    }

    while(f >> x)
        if(isdigit(x)) // daca e cifra
            apare[x - '0']++; // vector de freventa in care contorizez cifrele care apar
        else if(val[x]) // daca e litera si a fost modificata in tabel
            s += val[x] ; // adaug la suma
        else s += x; // daca e litera si nu a fost modificata,adaug la suma

    g << s << '\n';

    for(i = 0;i <= 9;i++)
        if(apare[i])
        k++;
    // am contorizat cate cifre am in sir

    for(i = 9,j = 1;j <= k / 2;i--)
        if(apare[i])
        g << i,j++;
    // afisez prima jumatate din numarul deal-vale
    if(k % 2 == 0)
        j = 1;
    else j = 0;

    for(i = 0;j <= k / 2;i++)
        if(apare[i])
        g << i,j++;
    // afisez a doua jumatate din numarul deal-vale
    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 #1953 tabel1

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