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);
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
#include <bits/stdc++.h> using namespace std; ifstream cin("tabel1.in"); ofstream cout("tabel1.out"); int f[200] , a[101] , p=0 , fr[10]; char s[1000001]; bool cifra(char ch) { return ch >= '0' && ch <= '9'; } int main() { int n; cin >> n; char ch; int x; for(int i = 1 ; i <= 199 ; ++i) f[i]=i; for(int i = 1 ; i <= n ; ++i) cin >> ch >> x , f[(int)ch]=x; for(int i = 48 ; i <= 57 ; ++i) f[i]=0; cin >> s; int cnt = 0; int i = 0; while(s[i]!='\0') { cnt+=f[(int)s[i]]; if(cifra(s[i]) && fr[(int)s[i]-48]==0) a[p]=(int)s[i]-48 , p++ , fr[(int)s[i]-48]++; i++; } sort(a , a+p); cout << cnt << endl; if(p%2==0) { for(int i = p-1 ; i >= p/2 ; --i) cout << a[i]; for(int i = 0 ; i < p/2 ; ++i) cout << a[i]; } else { for(int i = p-1 ; i > p/2 ; --i) cout << a[i]; for(int i = 0 ; i <= p/2 ; ++i) cout << a[i]; } return 0; }