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.

mobilni.cpp    1,449 b      izvorni kod rešenja
mobilni.checker.cpp    2,396 b      izvorni kod programa za testiranje
mobilni.checker.exe    41,248 b      program za testiranje
mobilni.tests.rar    91,230 b      test primeri

zadatak: Mobilni telefon

Stari mornar Đura je odavno zapao u demenciju, pa se često gubi u parkovima, gradskom prevozu i šahovskim turnirima. Njegov unuk je odlučio da mu za 90. rođendan kupi mobilni telefon kako bi u svakom trenutku mogao da obavesti rodbinu o svom kretanju. Pošto je Đura u ratu izgubio sluh, on može da komunicira isključivo sms porukama. Đurine stare kosti je u poslednje vreme zahvatila i reuma tako da kucanje poruka za njega predstavlja izuzetan napor. Kako je njegov mobilni jako skup i kvalitetan, moguće je menjati raspored slova na tasterima, pod uslovom da na svakom tasteru ostane isti broj slova (na svim po 3 slova, osim "1" na kome nema slova, "0" na kome je samo razmak, i "7" i "9" na kome se nalaze po 4 slova). Vaš zadatak je da za zadati tekst sms poruke rasporedite slova engleskog alfabeta po tasterima od "2" do "9" tako da Đura otkuca poruku sa što manjim brojem pritisaka.

Napomena:

Ako se na tasteru nalaze, redom, slova "a", "b" i "c", da bi se otkucalo "a" potreban je jedan pritisak, "b" dva, a "c" tri pritiska.

Ulaz:

U prvom redu ulazne datoteke ZAD4.DAT nalazi se broj N (N ≤ 20000), broj reči u tekstu. U svakom od narednih N redova se nalazi po jedna reč, dužine manje od 20 slova. Reči se sastoje isključivo od malih slova engleskog alfabeta, i smatra se da se između dve reči nalazi blanko karakter.

Izlaz:

U prvom redu izlazne datoteke ZAD4.RES treba ispisati broj pritisaka koji je potreban da bi se otkucala poruka (računajući i pritiske na "0", odnosno blanko karakter). Od drugog do devetog reda izlazne datoteke potrebno je ispisati dobijeni raspored i to, u drugom redu slova koja su raspoređena na taster "2", u trećem raspored za taster "3" itd.

Primer:

ZAD4.DAT      ZAD4.RES
7
krenuo
sam
na
kalemegdan 
da
hranim
golubove
        
54
alc
erf
nuj
mbp
ohq
dity
gsw
kvxz
rešenje

Slova koja se češće javljaju u tekstu treba staviti na čelna mesta tastera kako bi se kucala sa sto manje pritisaka. Potrebno je prebrojati broj pojavljivanja svakog slova u tekstu, sortirati slova u nerastući niz i prvih osam slova proizvoljno rasporediti na osam tastera, na svaki po jedno slovo. Zatim je potrebno sledećih šesnaest slova rasporediti na isti način, po osam, i konačno dva preostala slova dodeliti tasterima "7" i "9".

fajl: mobilni.cpp
#include <iostream.h>
#include <fstream.h>

long int a[26], b[26], n, tot = 0;
char tast[8][4];
int clicks[26];


void init()
{
  for (int i = 0; i <= 25; i++) 
  {
    a[i] = 0;
    clicks[i] = 0;
  }

  for (i = 0; i <= 7; i++)
  {
    for (int j = 0; j <= 3; j++) tast[i][j] = 0;
  }

}
void save()
{
  ofstream gout("zad4.res");

  gout << tot << endl;

  for (int i = 0; i <= 7; i++)
  {
    for (int j = 0; j <= 3; j++)
      if (tast[i][j] != 0) gout << tast[i][j];

    gout << endl;
  }
}
void load()
{
  ifstream gin("zad4.dat");
  char inBuf[25];

  gin >> n;
  gin.getline(inBuf, 25);

  for (long int i = 1; i <= n; i++)
  {
    gin.getline(inBuf, 25);

    for (long int j = 0; inBuf[j] != 0; j++) a[inBuf[j] - 97]++;
  }
}

void solve()
{
  long int m;
  int spot, i, j, k;

  for (i = 0; i <= 25; i++) b[i] = a[i];

  for (i = 0; i <= 2; i++)
  {
    for (j = 0; j <= 7; j++)
    {
      m = -1;
      spot = 0;
      for (k = 0; k <= 25; k++)
      {
        if (a[k] > m)
        {
          m = a[k];
          spot = k;
        }
      }

      tast[j][i] = spot + 97;
      a[spot] = -1;
      clicks[spot] = i + 1;
    }
  }

  for (i = 0; a[i] == -1; i++); tast[5][3] = i + 97; clicks[i] = 4; a[i] = -1;
  for (; a[i] == -1; i++); tast[7][3] = i + 97; clicks[i] = 4;

  tot = 0;
  for (i = 0; i <= 25; i++) tot += clicks[i] * b[i];

  tot += n - 1;

}



int main()
{
  load();
//  qsort(0, 25);
  solve();
  save();
  return 0;
}