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
perechix y
–x
este caracterul ce are valoareay
î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 .
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!