Rezolvare completă PbInfo #1612 Cifre10

Elevii clasei pregătitoare se joacă la matematică cu numere. Învățătoarea are un săculeț plin cu jetoane, pe fiecare dintre ele fiind scrisă câte o cifră. Fiecare elev și-a ales din săculeț mai multe jetoane, cu care și-a format un număr. Pentru ca totul să fie mai interesant, elevii s-au grupat în perechi. Doamna învățătoare a oferit fiecărei perechi de elevi câte o cutiuță pentru ca cei doi să își pună împreună jetoanele. De exemplu, dacă unul din elevii unei echipe și-a ales jetoane cu care a format numărul 5137131 iar celălalt elev și-a ales jetoane cu care a format numărul 6551813, atunci cutiuța echipei va conţine 5 jetoane cu cifra 1, câte 3 jetoane cu cifra 3 şi 5 şi câte un jeton cu cifrele 6, 7 şi 8.

Doar Andrei stătea supărat pentru că numărul de elevi al clasei era impar iar el nu avea partener, motiv pentru care nu și-a mai ales jetoane. Din această cauză, doamna învățătoare i-a spus:

“- Alege o echipă din a cărei cutiuță poţi lua o parte din jetoane, dar ai grijă ca fiecare dintre cei doi elevi să-și mai poată forma numărul lui din jetoanele rămase, iar tu să poți forma un număr nenul cu jetoanele extrase!“.

Dar cum Andrei nu se mulţumea cu puţin, a vrut să aleagă acea echipă din a cărei cutiuță îşi poată forma un număr de valoare maximă folosind jetoanele extrase.

Cerința

Scrieţi un program care să citească numărul N de cutiuțe și numerele formate de elevii fiecărei perechi și care să determine:

1) Numărul de cutiuțe din care Andrei poate lua jetoane respectând condiția pusă de doamna învățătoare;
2) Care este cel mai mare număr nenul pe care îl poate forma Andrei respectând aceeași condiție.

Date de intrare

Fișierul de intrare cifre10.in conține pe prima linie numărul natural P reprezentând cerința din problemă care trebuie rezolvată. Pe a doua linie numărul natural N, iar pe următoarele N linii câte două numere naturale separate printr-un spațiu reprezentând numerele formate de elevii fiecărei perechi.

Date de ieșire

  • Dacă valoarea lui P este 1, fişierul de ieşire cifre10.out va conţine pe prima linie un număr natural reprezentând rezolvarea primei cerințe, adică numărul de cutiuțe din care Andrei poate lua jetoane.
  • Dacă valoarea lui P este 2, fişierul de ieşire cifre10.out va conţine pe prima linie un număr natural reprezentând rezolvarea celei de a doua cerințe, adică numărul maxim pe care îl poate forma Andrei.

Restricții și precizări

  • 0 < N ≤ 10000
  • 1 ≤ numărul de jetoane al fiecărui elev ≤ 9
  • 0 ≤ cifra scrisă pe orice jeton ≤ 9
  • Se garantează că există cel puţin o cutiuţă din care Andrei îşi poate forma număr nenul
  • Pentru rezolvarea corectă a fiecărei cerinţe se obțin câte 50 de puncte

Exemplul 1

cifre10.in

1
3
1010 2000
12 34
1515 552

cifre10.out

1

Explicație

Cu jetoanele extrase din prima cutiuță Andrei nu poate forma un număr diferit de 0. Din a doua cutiuță Andrei nu poate lua jetoane astfel încât cei doi elevi să își mai poată forma numerele 12 și 34.

Andrei poate extrage jetoane doar din a treia cutiuță(două jetoane cu cifra 5).

Exemplul 2

cifre10.in

2
5
16815  38861
12  385
5137131  6551813
15033  11583
4704  240

cifre10.out

5311

Explicație

Numărul maxim pe care Andrei îl poate forma este 5311 și se obține din cutiuța a treia.

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

#include<iostream>
#include<fstream>
using namespace std;
ifstream f("cifre10.in");
ofstream g("cifre10.out");
int a[10],b[10],n,i,x,y,j,k,p,cod,cate,maxim, minim;
int main()
{
    f>>p>>n;
    for(i=1;i<=n;i++)
    {
        f>>x>>y;
        for(j=0;j<10;j++) a[j]=b[j]=0;
        while(x) {a[x%10]++; x=x/10;}
        while(y) {b[y%10]++; y=y/10;}
        cod=0;
        for(j=9;j>=0;j--)
            if(a[j]>0 && b[j]>0)
            {
                if(a[j]<b[j]) minim=a[j]; else minim=b[j];
                for(k=1;k<=minim;k++) cod=cod*10+j;
            }
        if(cod) cate++;
        if(cod>maxim) maxim=cod;
    }
    if(p==1) g<<cate;
       else g<<maxim;
    g.close();
    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 #1612 Cifre10

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