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.

imena.cpp    1,300 b      izvorni kod rešenja
imena.tests.rar    40,445 b      test primeri

zadatak: Imena

Grupa studenata psihologije dobila je zadatak da istraži uticaj imena na popularnost učenika u osnovnoj školi. Posmatrajući grupu osnovaca otkrili su nekoliko načina na koji osnovci računaju sličnost sa svojom simpatijom koji se zasnivaju na brojanju slova u svojim i imenima svojih drugara. Takođe su primetili da se imena nekih učenika mnogo češće nalaze u ovim igricama od drugih. Nakon dugotrajne debate odlučili su da je razlog za ovu popularnost određenih učenika raznovrsnost njihovih imena, odnosno broj različitih slova u imenima učenika. Pomozite im da provere ovu pretpostavku tako što ćete napisati program koji računa ove brojeve.

Ulaz:

(Ulazni podaci se nalaze u datoteci imena.in) U prvom redu nalazi se broj n (1 ≤ n ≤ 1000) i on predstavlja broj učenika. U svakom od sledećih n redova nalaze se ime i prezime po jednog učenika, bez razmaka između imena i prezimena. Dužine ovih nizova znakova neće biti veće od 100.

Izlaz:

(Izlazne podatke upisati u datoteku imena.out) U jednom redu izlaza ispisati dva cela broja: prvi koji predstavlja najveći broj različitih slova u imenu i prezimenu nekog učenika, drugi koji predstavlja broj učenika čija imena sadrže taj maksimalni broj slova.

Napomena.

Malo i veliko slovo 'a' (a slično i ostali parovi veliko i odgovarajuće malo slovo) se smatraju istim slovom. Sva slova će biti slova engleske abecede.

Primer:

imena.in      imena.out
5
PetarPetrovic
MilanMilanovic
MilanMilankovic
JovanPetrovic
JovanJovanovic
        
11 1

Objašnjenje.

Ime JovanPetrovic ima najviše različitih slova, 11, dok sva ostala imena imaju manje slova.

fajl: imena.cpp
#include<stdio.h>

int computeDistinct(char *s)
{
  // init array
  int frequencies [26];
  for (int i = 0; i < 26; i++)
  {
    frequencies[i] = 0;
  }
  // process the name
  bool moreLetters = true;
  int i = 0;
  while (moreLetters)
  {
    if ((s[i] >= 'A') && (s[i] <= 'Z'))
    {
      frequencies[s[i]-'A']++;
    }
    else if ((s[i] >= 'a') && (s[i] <= 'z'))
    {
      frequencies[s[i]-'a']++;
    }
    else
    {
      moreLetters = false;
    }
    i++;
  }
  // count distinct letters
  int distinct = 0;
  for (int i = 0; i < 26; i++)
  {
    distinct += (frequencies[i]>0);
  }
  return distinct;
}

int main()
{
  FILE *fIn;
  fIn = fopen("imena.in", "r");
  // read N
  int iCount;
  fscanf(fIn,"%d", &iCount);
  // init
  int iMaxDistinct = 0;
  int iNumMax = 0;
  for (int i = 0; i < iCount; i++)
  {
    // read and process individual names
    char pcName[101];
    fscanf(fIn,"%s", pcName);
    int iDistinct = computeDistinct(pcName);
    // update accumulated results
    if (iDistinct == iMaxDistinct)
    {
      iNumMax++;
    }
    if (iDistinct > iMaxDistinct)
    {
      iMaxDistinct = iDistinct;
      iNumMax = 1;
    }
  }
  // output results
  FILE *fOut;
  fOut = fopen("imena.out", "w");
  fprintf(fOut, "%d %d\n", iMaxDistinct, iNumMax);
  fclose(fIn);
  fclose(fOut);
  return 0;
}