TAKMIČENJA IZ PROGRAMIRANJA


Sva pitanja, predloge ili primedbe u vezi sa takmičenjima iz programiranja možete slati na e-mail:

tak.prog@gmail.com

U toku perioda za žalbe, sve žalbe možete slati na ovaj isti e-mail.

kamen.cpp    844 b      izvorni kod rešenja
kamen.tests.rar    339,234 b      test primeri

zadatak: Kamenčići

Mali Ðurica je našao N kamenčića. Na svakom kamenčiću je napisano jedno veliko slovo engleske abecede (slova od 'A' do 'Z'). On je izmerio svaki kamenčić i utvrdio njegovu masu u gramima. Nakon toga je napisao reč dužine M koja se sastoji samo od velikih slova engleske abecede. Malog Ðuricu zanima koja je najmanja masa kamenčića, koje treba da izabere, tako da kad ih nekako složi u jedan red dobije prethodno napisanu reč.
Pošto mali Ðurica želi da se igra, ovaj problem je prepustio Vama.

Ulaz:

(Ulazni podaci se nalaze u datoteci kamen.in) U prvom redu ulazne datoteke se nalaze celi brojevi N (1 ≤ N ≤ 50000) i M (1 ≤ M ≤ 50000). U narednih N redova se nalaze po jedno slovo si i jedan ceo broj ti, gde si predstavlja slovo na i-tom kamenčiću (si će uvek biti veliko slovo engleske abecede), a ti (1 ≤ ti ≤ 50000) masu i-tog kamenčića. Potom se učitava M redova koji sadrže po jedno slovo i to su redom slova reči koju je napisao mali Đurica.

Izlaz:

(Izlazne podatke upisati u datoteku kamen.out) U prvom redu datoteke ispisati najmanju ukupnu masu kamenčića koje je potrebno koristiti da bi se njihovim slaganjem dobila napisana reč. Ako je nemoguće dobiti napisanu reč ispisati -1.

Ogranicenja:

  • 1 ≤ N ≤ 50000
  • 1 ≤ M ≤ 50000
  • 1 ≤ ti ≤ 50000
  • 'A'si'Z'
  • vremensko ogranicenje za izvršavanje programa je 1 s.

Primer 1:

kamen.in      kamen.out
5 3
A 10
B 40
C 30
B 20
E 50
C
E
B
        
100

Primer 2:

kamen.in      kamen.out
14 11
A 1
I 2
K 3
L 4
O 5
P 6
N 7
F 8
R 9
O 10
M 11
T 12
I 13
Z 14
I
N
F
O
R
M
A
T
I
K
A
        
-1
fajl: kamen.cpp
#include <iostream>
#include <cstdio>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;


int main(){
  ofstream fout("kamen.out");
  ifstream fin("kamen.in");
  int n, m;
  fin >> n >> m;
  vector <int> ic[26];
  int cnt[26];
  for (int i = 0; i < 26; i++){
    ic[i].clear();
    cnt[i] = 0;
  }
  int ret = 0, t;
  char cc;
  for (int i = 0; i < n; i++){
    fin >> cc >> t;
    ic[cc - 'A'].push_back(t);
  }
  for (int i = 0; i < 26; i++)
    sort(ic[i].begin(), ic[i].end());
  for (int i = 0; i < m; i++){
    fin >> cc;
    cnt[cc - 'A']++;
  }
  for (int i = 0; i < 26 && ret != -1; i++)
    for (int j = 0; j < cnt[i]; j++)
      if (ic[i].size() == j){
        ret = -1;
        break;
      }
      else
        ret += ic[i][j];
  fout << ret << endl;
  fout.close();
  fin.close();
  return 0;
}