Algorel a primit un joc care conţine n
jetoane pe care sunt scrise litere mari ale alfabetului. Fiecare literă are asociat un cod format dintr-o singură cifră nenulă. Jetoanele se aşează în ordinea dată iniţial, iar prin citirea literelor de pe acestea, de la primul la ultimul jeton, se formează un cuvânt. Dacă se citesc numerele de pe fiecare jeton, începând de la primul la ultimul, se obţine un număr k
1
. Jocul continuă la fel, dar se aşează jetoanele începând de la al doilea la ultimul, obţinându-se un nou număr k
2
. Apoi, se aşează jetoanele începând de la al treilea la ultimul, obţinându-se un nou număr k
3
, ş.a.m.d. până se ajunge la aşezarea doar a ultimului jeton, caz în care se obţine numărul k
n
.
Cerinţe:
Scrieţi un program care citeşte numărul n
de jetoane, cele n
litere asociate jetoanelor, precum şi codurile asociate literelor, în ordinea apariţiei lor şi afişează:
a) numărul de perechi de litere consecutive din cuvântul iniţial care au proprietatea că o literă este vocală şi cealaltă este consoană (ordinea lor nu contează);
b) numărul k
1
, format din aşezarea iniţială a jetoanelor;
c) suma k
1
+k
2
+…+k
n
.
Date de intrare
Fișierul de intrare litere.in
conține pe prima linie valoarea lui n
, reprezentând numărul de jetoane, pe a doua linie un cuvânt format din n litere mari (de la ’A’
la ’Z’
); literele sunt scrise una după alta, fără să fie separate cu spaţii, astfel încât prima literă este cea aflată pe primul jeton, a doua literă pe al doilea jeton ş.a.m.d. Pe a treia linie din fişier se află un număr m
ce reprezintă numărul de litere distincte, iar pe a patra linie m
valori reprezentând codurile literelor distincte ce apar în cuvânt. Codurile sunt date în ordinea apariţiei literelor în cuvânt şi sunt numere naturale nenule formate dintr-o singură cifră, separate printr-un spaţiu, pentru fiecare literă codul fiind dat o singură dată, chiar dacă litera se repetă.
Date de ieșire
Fișierul de ieșire litere.out
va conține pe prima linie numărul de perechi de litere consecutive din cuvânt care au proprietatea că o literă este vocală şi cealaltă consoană (ordinea lor nu contează), pe a doua linie numărul k
1
, (format din aşezarea iniţială a jetoanelor), iar pe a treia linie suma k
1
+k
2
+…+k
n
.
Restricții și precizări
0 < n ≤ 10000
0 < m < 27
Exemplul 1
litere.in
3 CSC 2 1 2
litere.out
0 121 143
Explicație
- Nu există perechi de litere consecutive care să îndeplinească cerinţa.
- Sunt
2
litere distincte{’C’,’S’}
,cod(’C’)=1
,cod(’S’)=2
.
k
1
= 121
‚k
2
= 21
‚k
3
= 1
‚ iark
1
+k
2
+k
3
= 121 + 21 + 1 = 143
Exemplul
litere.in
6 CABABE 4 2 5 6 7
litere.out
5 256567 320342
Explicație
- Există
5
perechi de litere consecutive care să îndeplinească cerinţa:{’CA’, ’AB’, ’BA’, ’AB’, ’BE’}
. - Sunt
4
litere distincte{’C’, ’A’, ’B’, ’E’}
,cod(’C’)=2
,cod(’A’)=5
,cod(’B’)=6
,cod(’E’)=7
. k
1
= 256567
‚k
2
= 56567
‚k
3
= 6567
‚k
4
= 567
,k
5
= 67
,k
6
= 7
, iark
1
+k
2
+k
3
+k
4
+k
5
+k
6
= 256567 + 56567 + 6567 + 567 + 67 + 7 = 320342
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 Litere:
//O(N)
#include <cstdio>
#include <cstring>
using namespace std;
char S[30002];
char c;
char voc[] = "AEIOU";
long int a, N, C, k, j, i, T, aux;
char P[130], cod[130];
long int L[30];
int main() {
FILE *f = fopen("litere.in","r");
FILE *g = fopen("litere.out","w");
fscanf(f,"%d",&N);
fscanf(f,"%s",S+1);
a = 0;
k = 0;
for (i=1;i<N;i++) {
if ((strchr(voc, S[i]) && !strchr(voc, S[i+1])) ||
(!strchr(voc, S[i]) && strchr(voc, S[i+1]))) {
a++;
}
if (!P[S[i]])
P[S[i]] = ++k;
}
if (!P[S[N]])
P[S[N]] = ++k;
fprintf(g,"%d\n",a);
fscanf(f,"%d",&C);
for (i=1;i<=C;i++) {
fscanf (f,"%d",&L[i]);
}
for (i=1;i<=N;i++)
S[i] = L[P[S[i]]];
for (i=1;i<=N;i++) {
fprintf(g,"%c",S[i] + '0');
}
for (i=1,j=N;i<=j;i++,j--) {
c = S[i];
S[i] = S[j];
S[j] = c;
}
for (i=1, T = 0;i<=N;i++) {
aux = S[i] * (N-i+1) + T;
S[i] = aux%10;
T = aux/10;
}
while (T) {
S[++N] = T%10;
T/=10;
}
fprintf(g,"\n");
for (i=N;i>=1;i--) {
fprintf(g,"%c",S[i] + '0');
}
fclose(f);
fclose(g);
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 #1077 Litere
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1077 Litere 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!