fbpx

Problema #856 – Valori – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Gigel se joacă cu cuvinte (scrise cu litere din alfabetul englez, mari sau mici). El a asociat fiecărei litere din alfabet o valoare număr natural, pe care a numit-o valoarea literei. Apoi a definit valoarea unui cuvânt astfel: se calculează suma S1 a valorilor literelor mici din cuvânt şi suma S2 a valorilor literelor mari din cuvânt. Valoarea cuvântului va fi S1 - S2.

Cunoscându-se valoarea fiecărei litere din alfabet şi o listă de cuvinte, să se determine cuvântul cu valoarea maximă. Dacă există mai multe cuvinte de valoare maximă, se vor determina toate, în ordinea din lista dată.

Date de intrare

Fișierul de intrare valori.in conține pe prima linie numărul 26 de numere, reprezentând, în ordine, valorile literelor din alfabet, pe a doua linie numărul de cuvinte n iar pe următoarele n linii câte un cuvânt format din litere mari şi mici ale alfabetului englez.

Date de ieșire

Fișierul de ieșire valori.out va conține cuvintele de valoare maximă din lista dată, în ordinea din listă, fiecare cuvânt pe câte o linie.

Restricții și precizări

  • valorile literelor sunt numere naturale mai mici decât 1000
  • 1 ≤ n ≤ 1000
  • fiecare dintre cuvintele date conţine cel mult 255 caractere

Exemplu

valori.in

2 7 7 3 9 8 9 6 3 9 6 6 6 5 5 8 2 6 6 1 5 6 9 4 7 3 
4
BaciL
AbAc
Aba
AbEcEdAr

valori.out

AbAc

Observaţie

Valoarea unui cuvânt poate fi negativă. De exemplu, valoarea cuvântului BaciL este (2+7+3)-(7+6)=-1

#include <bits/stdc++.h>

using namespace std;

ifstream cin("valori.in");
ofstream cout("valori.out");

int vec[30];
char m[1001][1001];

int main()
{
    for(int i = 0 ; i < 26 ; ++i)
        cin >> vec[i];
    int n;
    cin >> n;
    int max = -1000000;
    for(int f = 1 ; f <= n ; ++f)
    {
        char s[501];
        cin >> s;
        int i = 0;
        int s1=0 , s2=0;
        while(s[i]!='\0')
        {
            if(s[i]>='A' && s[i]<='Z')
                s1+=vec[(int)s[i]-65];
            else
                s2+=vec[(int)s[i]-97];
            i++;
        }
        if(s2-s1>max)
            max=s2-s1;
        strcpy(m[f] , s);
    }
    for(int f = 1 ; f <= n ; ++f)
    {
        char s[501];
        strcpy(s , m[f]);
        int i = 0;
        int s1=0 , s2=0;
        while(s[i]!='\0')
        {
            if(s[i]>='A' && s[i]<='Z')
                s1+=vec[(int)s[i]-65];
            else
                s2+=vec[(int)s[i]-97];
            i++;
        }
        if(s2-s1==max)
            cout << s << endl;
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa