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.

karika.cpp    1,028 b      izvorni kod rešenja
karika.tests.rar    59,016 b      test primeri

zadatak: Najslabija karika

U popularnom televizijskom kvizu "Najslabija karika" nekoliko takmičara redom u krug odgovaraju na postavljena pitanja. Prvi tačan odgovor donosi jedan dinar, dok svaki sledeći tačan odgovor u nizu donosi duplo više poena nego prethodni. Kada neko odgovori netačno - lanac se prekida i sledeći tačan odgovor donosi 1 dinar. Kada takmičar kaže "Banka", sav novac u trenutnom lancu tačnih odgovora se dodaje na ukupnu zagarantovanu sumu, a naredni tačan odgovor ponovo vredi 1 dinar. Ako takmičari u nizu daju 15 tačnih odgovora, a između nije bilo bankiranja - nagrada iznosi neverovatnih 1000000000 (milijardu) dinara, bez obzira da li je neko rekao "Banka" ili su pre toga takmičari osvojili nešto novca. Vama su na raspolaganju podaci iz prethodne emisije. Treba odrediti koliko dinara su takmičari zaradili.

Ulaz:

(Ulazni podaci se nalaze u datoteci karika.in) U prvom redu ulazne datoteke se nalazi niz znakova. Svaki od znakova je iz skupa {'0', 'X', 'B'}, (sva tri moguća znaka su velika slova, što znaci da prvi od tri znaka nije cifra nula, vec slovo O) i oni predstavljaju tačan odgovor, netačan odgovor i banku. Dužina niza znakova je manja ili jednaka od 100000.

Izlaz:

(Izlazne podatke upisati u datoteku karika.out) U izlaznu datoteku treba upisati broj dinara koji su takmičari zaradili.

Primer 1:

karika.in      karika.out
OOOBXOXBXOOBOX
        
10

Objašnjenje.

Posle bankiranja, takmičari redom dobijaju 7 + 0 + 3 = 10 dinara.

Primer 2:

karika.in      karika.out
XOOBOOOOOOOOOOOOOOOOXOOB
        
1000000000

Objašnjenje.

Takmičari imaju niz od 15 tačnih odgovora, pa zarađuju 1000000000 dinara.

fajl: karika.cpp
/*
  Zadatak najlakse resavamo, tako sto ucitavamo redom karaktere iz ulaznog fajla i odmah ih procesiramo.
  Ako naidjemo na karakter koji je razlicit od X, O ili B, prekidamo izvrsavanje i stampamo resenje. 
  U promenljivoj money cuvamo trenutnu zaradu igraca. Nju azuriramo samo kada neko kaze banka i dodajemo
  1 + 2 + 4 + ... + 2^n = 2^(n + 1) - 1 dinara, gde je n duzina lanca tacnih odgovora. Ukoliko je duzina
  trenutnog lanca 15, tada postavljamo osvojenu sumu novca na 1.000.000.000 i izlazimo iz while petlje. 
*/

#include <stdio.h>
long money, n;
char c;

int main ()
{
  FILE *in = fopen ("karika.in", "r");
  money = 0;
  n = 0;
  while (true) 
  {
    c = fgetc (in);
    if (n == 15)
    {
      money = 1000000000;
      break;
    }
    if (c == 'X')
      n = 0;
    else if (c == 'O')
      n++;
    else if (c == 'B')
    {
      money += (1 << n) - 1;
      n = 0;
    }
    else
      break;
  }
  fclose (in);
  FILE *out = fopen ("karika.out", "w");
  fprintf (out, "%ld\n", money);
  fclose (out);
  return 0;
}