Informatică, întrebare adresată de BrainlyUserBTW, 8 ani în urmă

Seif2
Matei tocmai a început clasa a 9 - a, iar părinţii lui i-au cumpărat un seif în care au pus un cadou surpriză deoarece acesta a intrat la liceu. Mecanismul de deschidere a seifului are o bandă ascunsă, cu n numere gravate pe ea. Banda poate fi deplasată stânga sau dreapta, astfel încât pe un ecran pot fi aduse oricare două numere consecutive (dar doar două numere). Seiful are şi taste prin care se poate introduce codul secret care îl deschide. Părinţii lui Matei i-au spus că acel cod este cel mai mare dintre numerele formate din perechile vizibile ale benzii, lipind numărul din dreapta la finalul celui din stânga. De exemplu, dacă numerele din bandă vizibile pe ecran sunt 23 şi 455, codul format prin lipirea lor este 23455.

Matei a scos o foaie şi a văzut că sunt n-1 coduri posibile.


Cerinţă
Scrieţi un program care să afle codul de la seif pentru ca Matei să poată afla ce cadou se află în el.


Date de intrare
Fişierul de intrare seif2.in conţine pe prima linie numărul de numere n ale benzii. Pe a doua linie conţine cele n numere, despărţite printr-un spaţiu.


Date de ieşire
În fişierul de ieşire seif2.out veţi scrie codul ce deschide seiful, şi anume cel mai mare număr ce se poate forma prin alăturarea a două numere consecutive pe bandă.


Restricţii
2 ≤ n ≤ 100 000
Numerele din secvenţă sunt naturale şi au maxim patru cifre
0 lipit cu 30 dă 30
30 lipit cu 0 dă 300


Exemplu
seif2.in seif2.out


Explicaţie
11
12 5 30 1 263 6 212 2 84 35 94
8435
Codurile formate prin lipirea numerelor consecutive, două câte două, sunt:
125 530 301 1263 2636 6212 2122 284 8435 3594. Maximul este 8435.

Răspunsuri la întrebare

Răspuns de radu9614
1

Răspuns:

#include <fstream>

using namespace std;

ifstream fin( "seif2.in" );

ofstream fout( "seif2.out" );

int             v[ 100001 ];

int nrDeCifre( int x )

{

   int nrCif = 0;

   while( x != 0 )

   {

       ++nrCif;

       x /= 10;

   }

   return nrCif;

}

int main()

{

   int             n = 0, maxim = -1;

   fin >> n;

   for( int i = 0; i < n; ++i )

   {

       fin >> v[ i ];

   }

   for( int i = 0; i < n - 1; ++i )

   {

       int nr1 = v[ i ], nr2 = v[ i + 1 ], cifru = 0, p = 1;

       for( int j = 0; j < nrDeCifre( nr2 ); ++j )

       {

           p *= 10;

       }

       cifru = nr1 * p + nr2;

       if( cifru > maxim )

           maxim = cifru;

   }

   fout << maxim;

   return 0;

}

Explicație:

Banuiesc ca problema este de pe pbinfo, dar nu am gasit-o. Daca imi spui codul problemei o testez acolo ca sa fiu sigur ca iti da 100. Pe exemplul tau mi-a dat, dar nu am testat pe cazut de limita.


radu9614: bine, ma apuc acum sa fac fara vectori
radu9614: gata, am facut fara vectori
radu9614: #include

using namespace std;

ifstream fin( "seif2.in" );
ofstream fout( "seif2.out" );

int nrDeCifre( int x )
{
int nrCif = 0;

if( x <= 9 )
return 1;
while( x != 0 )
{
++nrCif;
x /= 10;
}
return nrCif;
}
radu9614: int main()
{
int n = 0, nrAnterior = 0, nrCurent = 0, maxim = -1;

fin >> n;
fin >> nrAnterior;
for( int i = 1; i < n; ++i )
{
fin >> nrCurent;
int cifru = 0, putere = 1;

for( int j = 0; j < nrDeCifre( nrCurent ); ++j )
{
putere *= 10;
}
cifru = nrAnterior * putere + nrCurent;
if( cifru > maxim )
maxim = cifru;
nrAnterior = nrCurent;
}
fout << maxim;
return 0;
}
radu9614: 100 pe vianu arena
BrainlyUserBTW: Hey
BrainlyUserBTW: Poti sa imi dai un raspuns si explicatii la problema maxnrk?
BrainlyUserBTW: Tot de pe Vianu Arena
BrainlyUserBTW: si la Padure
BrainlyUserBTW: Tot de pe varena
Alte întrebări interesante