Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet 20172017
; numerele cu trei cifre consecutive care se pot extrage sunt 201
, 172
, 720
și 201
. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?
Cerința
Fiind numărul un număr natural n
și n
numere naturale x
(100 ≤ x ≤ 4294967295
) să se determine:
1. Cel mai mic și cel mai mare număr din trei cifre consecutive care apar în cele n
numere, de câte ori apar ele, în ce număr x[1]
apar prima dată și în ce număr x[2]
apar ultima dată.
2. Numerele din trei cifre consecutive care apar de cele mai multe ori în cele n
numere.
Date de intrare
Fișierul de intrare 3cifre.in
conţine pe prima linie, separate printr-un spațiu, numărul natural n
, reprezentând numărul de numere și cerința (1
sau 2
). Pe cea de a doua linie sunt scrise cele n
numere naturale x[1] x[2] ... x[n]
, separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire 3cifre.out
va conține, pentru cerința 1
, pe prima linie patru valori naturale nrmin nrapmin x1min x1max
, separate prin câte un spațiu, reprezentând numărul minim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată, iar pe linia a doua alte patru valori naturale nrmax nrapmax x2min x2max
, separate prin câte un spațiu, reprezentând numărul maxim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată. Pentru cerința 2
, fișierul de ieșire va conține pe prima linie numărul maxim de apariții a numerelor din trei cifre consecutive care apar, iar pe linia a doua, separate prin câte un spațiu, numerele respective în ordine crescătoare.
Restricții și precizări
1 ≤ n ≤ 500000
100 ≤ x[i] ≤ 4294967295
Exemplul 1:
3cifre.in
7 1 415 5213 2017 666 12345678 10000013 13
3cifre.out
100 1 10000013 10000013 678 1 12345678 12345678
Exemplul 2:
3cifre.in
7 1 415 521013 206678 666 12345678 10101013 13
3cifre.out
101 4 521013 10101013 678 2 206678 12345678
Exemplul 3:
3cifre.in
7 2 1115 52113 2017 666 12345678 11101113 113
3cifre.out
3 111 113
Explicație
Se observă că atât 111
cât și 113
apar de câte 3
ori.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema 3cifre:
//Marinel Serban - ianuarie 2017
#include <bits/stdc++.h>
using namespace std;
ifstream fin("3cifre.in");
ofstream fout("3cifre.out");
unsigned int n, cerinta, i, nrmaxap, nrmin = 1000, nrapmin, nrmax = 99, nrapmax, nr3cifre;
unsigned int x1min, x1max, x2min, x2max;
unsigned int x, copiex;
int VF[1010];
int main()
{
fin >> n >> cerinta;
while (n > 0) //cat timp mai am numere
{
fin >> x; //citesc un n umar
copiex = x;
while (x > 99) //cat timp are cel putin 3 cifre
{
nr3cifre = x % 1000; //extrag un numar din 3 cifre alaturate
if (nr3cifre > 99) //este din 3 cifre?
{
if (cerinta == 1) //cerinta 1
{
if (nr3cifre < nrmin) //am gasit un nou minim?
{
nrmin = nr3cifre; //retine
nrapmin = 1; //apare prima data
x1min = copiex; //in acest numar
x1max = copiex; //deocamdata el este si ultimul
}
else
if (nr3cifre == nrmin)//este egal cu minimul curent?
{
nrapmin++; //contorizeaza
x1max = copiex; //ultima aparitie
}
if (nr3cifre > nrmax) //am gasit un nou maxim?
{
nrmax = nr3cifre; //retine
nrapmax = 1; //apare prima data
x2min = copiex; //in acest numar
x2max = copiex; //deocamdata el este si ultimul
}
else
if (nr3cifre == nrmax)//este egal cu maximul curent
{
nrapmax++; //contorizeaza
x2max = copiex; //ultima aparitie
}
}
else //este cerinta 2
{
VF[nr3cifre]++; //contorizeaza in VF
if (VF[nr3cifre] > nrmaxap) //numar maxim de aparitii
nrmaxap = VF[nr3cifre]; //actualizat permanent
}
}
x /= 10; //elimina ultima cifra din x
}
n--; //am terminat un numar
}
if (cerinta == 1) //afisare cerinta 1
{
fout << nrmin << ' ' << nrapmin << ' ' << x1min << ' ' << x1max << '\n';
fout << nrmax << ' ' << nrapmax << ' ' << x2min << ' ' << x2max << '\n';
}
else
{
fout << nrmaxap << '\n';
for (i = 100; i <= 999; i++) //parcurg vectorul de frecventa
if (VF[i] == nrmaxap)
fout << i << ' '; //afisare cerinta 2
fout << '\n';
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2182 3cifre
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2182 3cifre de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!