fbpx

Problema #1122 – Babilon – Rezolvari PBInfo

de Mihai-Alexandru

Babilonienii au dezvoltat  un sistem pozițional de scriere a numerelor, în care orice număr natural se poate reprezenta utilizând semnele (unu), (zece) şi spaţii.

Valorile k din {2, 3, … , 9} se obțin scriind semnul de k ori (scrierea babiloniană a lui 3 este ). 

Numerele 11, 12, … , 59 se obțin ca succesiuni de semne urmate de semne (43 se reprezintă ca

Babilonienii au dezvoltat  un sistem pozițional de scriere a numerelor, în care orice număr natural se poate reprezenta utilizând semnele (unu), (zece) şi spaţii.

Valorile k din {2, 3, … , 9} se obțin scriind semnul de k ori (scrierea babiloniană a lui 3 este ). 

Numerele 11, 12, … , 59 se obțin ca succesiuni de semne urmate de semne (43 se reprezintă ca
).

Sistemul folosește gruparea unităților câte șaizeci. Astfel, pentru a scrie umărul șaizeci se folosește același semn ca pentru unu, dar valoarea sa este dată de poziția în care se găsește semnul .

Babilonienii nu foloseau cifra 0. Pentru poziţionarea corectă a semnelor se utiliza spațiu (60 se reprezintă ca , 3600 se reprezintă ca etc.).

Se codifică scrierea babiloniană a unui număr utilizând cifra 1 în locul semnului , cifra 2 în locul semnului și cifra 3 în loc de spațiu, ca în exemplele de mai jos:

Scrierea babiloniană
Codificarea scrierii babiloniene 1311 12 1221111 123111
Valoarea zecimală a numărului 1*60+2=62 1*60+10=70 1*60+20+4=84 1*60*60+10*60+3=4203

Cerință

Dându-se un număr natural n și un șir de n cifre din mulțimea {1, 2, 3}, reprezentând codificarea scrierii babiloniene a unui număr natural, să se determine:
a) numărul maxim de cifre 1 aflate pe poziții consecutive în codificarea scrierii babiloniene date;
b) numărul natural din sistemul zecimal corespunzător scrierii babiloniene date.

Date de intrare

Fișierul de intrare babilon.in conține:

  • pe prima linie un număr natural p ( 1 ≤ p ≤ 2 );
  • pe a doua linie un număr natural n;
  • pe a treia linie n cifre separate prin câte un spațiu, reprezentând codificarea scrierii babiloniene a unui număr natural.

Date de ieșire

Dacă valoarea lui p este 1, atunci se va rezolva numai punctul a) din cerință. În acest caz, fişierul de ieşire babilon.out va conţine pe prima linie un număr natural reprezentând numărul maxim de cifre 1 aflate pe poziții consecutive în codificarea scrierii babiloniene date.

Dacă valoarea lui p este 2, atunci se va rezolva numai punctul b) din cerință. În acest caz, fişierul de ieşire babilon.out va conţine pe prima linie numărul natural corespunzător scrierii babiloniene date.

Restricții și precizări

  • 2 ≤ n ≤ 109;
  • se garantează faptul că numărul de cifre al rezultatului de la punctul b) (numărul zecimal) este mai mic decât 20;
  • 30% din teste vor avea pe prima linie valoarea 1, iar restul de 70% din teste vor avea pe prima linie valoarea 2.

Exemplul 1

babilon.in

1
8
1 1 3 2 1 1 1 2

babilon.out

3

Explicație

1 1 3 2 1 1 1 2. Cea mai lungă secvență de cifre 1 are lungimea 3.

Exemplul 2

babilon.in

2
7
1 1 3 2 1 1 1

babilon.out

7213

Explicație


2 se înmulțește de două ori cu 60 (o dată pentru că este urmat de spațiu și încă o dată pentru că precede o grupă care începe cu semnul ), apoi se adună valoarea 13.

2*60*60+10+3=7213

Exemplul 3

babilon.in

2
9
1 1 1 2 1 1 2 2 1

babilon.out

11541

Explicație


3 se înmulțește cu 60 de două ori pentru că este precedat de două grupe care încep cu semnul , apoi se adună 12 înmulţit cu 60 şi la final se adună 21.

3*60*60+12*60+21=11541

#include <bits/stdc++.h>
using namespace std;
ifstream cin("babilon.in");
ofstream cout("babilon.out");
int cer , n , i , a[121] , l , lmax , prec;
long long cnt;
int main()
{
    cin >> cer >> n;
    for(i = 1 ; i <= n ; i++) cin >> a[i];
    if(cer == 1)
    {
        for(i = 1 ; i <= n ; i++)
        {
            if(a[i]==1) l++;
            else
            {
                if(l > lmax) lmax = l;
                l = 0;
            }
        }
        if(l > lmax) lmax = l;
        l=0;
        cout << lmax << endl;
    }
    else
    {
        for(i = 1 ; i <= n ; i++)
           if(a[i] == 1) cnt++ , prec=a[i];
           else if(a[i]==3) cnt *= 60;
                else
                {
                    if(prec == 1)cnt *= 60;
                    cnt += 10;
                    prec = a[i];
                }
        cout << cnt;
    }
}
Comentarii

S-ar putea sa iti placa