Rezolvare completă PbInfo #2182 3cifre

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 Adresa de email.

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!