Rezolvare completă PbInfo #2009 Accesibil

Un număr natural de cel puțin două cifre se numește accesibil dacă este format din cifre consecutive în ordine strict crescătoare. (23 și 6789 sunt numere accesibile, în timp ce 7, 2334 și 654 nu sunt numere accesibile)

Cerința

Scrieți un program care să citească numerele k, n și un șir de n numere naturale și să afișeze:

a) cele mai mari 3 numere accesibile, nu neapărat distincte, din șirul de n numere;
b) câte dintre numerele din șirul dat care nu sunt accesibile, devin accesibile prin eliminarea exact a unei cifre;
c) cel mai mic și cel mai mare număr accesibil format din k cifre;
d) numărul numerelor accesibile pare de k cifre și numărul numerelor accesibile impare de k cifre.

Date de intrare

Fișierul de intrare accesibil.in conține pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p este un număr din mulțimea {1,2,3,4}. Pe linia a doua a fișierului de intrare se găsesc k și n, iar pe a treia linie a fișierului de află n numere naturale separate prin câte un spațiu.

Date de ieșire

Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerințe. În acest caz, în fișierul de ieșire accesibil.out se vor scrie, în ordine crescătoare, separate prin câte un spațiu, cele mai mari trei numere accesibile dintre cele n numere aflate pe a treia linie a fișierului. Se garantează că pentru p = 1 sunt cel puțin trei numere accesibile în șirul de n numere.

Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerințe. În acest caz, în fișierul de ieșire se va scrie numărul numerelor din șirul dat care nu sunt accesibile, dar care ar deveni accesibile dacă li s-ar elimina o cifră.

Dacă valoarea lui p este 3, se va rezolva numai punctul c) din cerințe. În acest caz, în fișierul de ieșire se vor scrie două valori, separate printr-un spațiu, reprezentând cel mai mic număr accesibil de k cifre și cel mai mare număr accesibil de k cifre. Dacă cele două numere ce ar trebui afișate coincid se va afișa valoarea lor comună o singură dată.

Dacă valoarea lui p este 4, se va rezolva numai punctul d) din cerințe. În acest caz, în fișierul de ieșire se vor scrie două valori reprezentând numărul numerelor accesibile pare de k cifre și numărul numerelor accesibile impare de k cifre, în această ordine, separate prin spațiu.

Restricții și precizări

  • 2 ≤ k ≤ 9 și 3 ≤ n ≤ 100 000;
  • 0 ≤ numerele din șir ≤ 2000 000 000;
  • Din numărul 5073, de exemplu, prin eliminarea unei cifre se obțin numerele 507, 503, 573 și 73;
  • Pentru a rezolva cerințele a) și b) nu folosim valoarea lui k, iar pentru cerințele c) și d) nu folosim șirul de n numere;
  • Se acordă: 40 de puncte pentru cerința a); 30 de puncte pentru cerința b); 10 puncte pentru cerința c);
    10 puncte pentru cerința d);
  • În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemple.

Exemplul 1

accesibil.in

1
3 8
6 12 235 5678 90 987 234 5678

accesibil.out

234 5678 5678

Exemplul 2

accesibil.in

2
3 9
4 34 123 1238 301 689 4560 7023 1238

accesibil.out

5

Exemplul 3

accesibil.in

3
4 3
12 345 67

accesibil.out

1234 6789

Exemplul 4

accesibil.in

4
9 3
12 345 67

accesibil.out

0 1

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 Accesibil:

#include <fstream>
#include <iostream>
using namespace std;
ifstream f ("accesibil.in");
ofstream g ("accesibil.out");
int accesibil (int n)// verific daca n este accesibil
{
    int u,c;
    if (n<10) return 0;
    u=n%10;
    n=n/10;
    while (n!=0)
    {
        c=n%10;
        if (c+1!=u) return 0;
        u=c;
        n=n/10;
    }
    return 1;
}
int devine_accesibil(int n)
{
    if(accesibil(n)|| n<100) return 0;
    long long  p=1;
    int y;
    while (p<=n)
    {
        y=n/(p*10)*p+n%p;
        if (accesibil(y))
        {
            //cout<<y<<' ';
            return 1;}
        p=p*10;
    }
return 0;
}
int main()
{
    int p,n,k,x,nr=0,m1=0,m2=0,m3=0;
    f>>p>>k>>n;
    if (p==1)
    {
        for (int i=1;i<=n; i++)
        {
            f>>x;
            if (accesibil(x))
            {
                if (x>=m1) { m3=m2;m2=m1;m1=x;}
                else
                if (x>=m2) { m3=m2;m2=x;}
                else
                if (x>=m3) { m3=x;}
            }
        }
        if (m3==0) g<<-1<<'\n';
        else g<<m3<<' '<<m2<<' '<<m1<<'\n';
    }
    else if (p==2)
    {
        for (int i=1;i<=n; i++)
        {
            f>>x;
             // g<<'\n'<<i<<' '<<x<<' ';
            if (devine_accesibil(x))
            {
              //  g<<x;
                 nr++;
            }
        }
        g<<nr<<'\n';
    }
     else if (p==3)
     {
         for (int i=1;i<=k;i++) g<<i;
         if (k!=9)
         {
             g<<' ';
             for (int i=1;i<=k;i++) g<<9-k+i;
         }
          g<<'\n';
     }
     else
     {
         g<<(10-k)/2<<' '<<(10-k+1)/2<<'\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 #2009 Accesibil

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2009 Accesibil 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!