# PBinfo #1045 – Imprimanta – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cif-Oji6 este o imprimantă matriceală numită şi imprimantă cu ace, deoarece tipărirea se realizează prin impactul acelor capului de imprimare pe o bandă  cu tuş. 
Acele sunt aranjate într-o grilă dreptunghiulară formată din 5 rânduri de ace, pe fiecare rând aflându-se la distanţe egale câte 3 ace, aşa cum se observă  în figura alăturată. 
Prin acţionarea diferitelor combinaţii de ace din grilă, se defineşte forma fiecărei cifre ce permite tipărirea acesteia prin puncte, în felul următor:

         

De exemplu, cifra 2 va fi tipărită prin 11 puncte ca rezultat al acţionării a 11 ace din grilă: din primul rând de ace al grilei se vor acţiona toate cele 3 ace, din următorul rând doar acul din dreapta, apoi de pe următorul rând toate cele 3 ace, apoi acul din stânga de pe penultimul rând iar din ultimul rând toate cele 3 ace.

Cerințe
a) Ştiind că imprimanta Cif-Oji6 a tipărit numărul N, determinaţi care este cea mai mare cifră a numărul N pentru care s-a acţionat un număr minim de ace ale grilei.
b) Ştiind că imprimanta mai are tuş pe bandă doar pentru imprimarea a K puncte, determinaţi cel mai mare  număr natural ce poate fi tipărit prin exact K puncte.

Date de intrare
Fișierul de intrare imprimanta.in conține pe prima linie două numere naturale N şi K separate printr-un spaţiu, unde N reprezintă numărul tipărit de imprimantă iar K numărul de puncte pentru care imprimanta mai are tuş.

Date de ieșire
Fișierul de ieșire imprimanta.out va conține:


pe prima linie un singur număr natural ce reprezintă cea mai mare cifră a numărul N pentru care s-a acţionat un număr minim de ace ale grilei.
pe cea de-a doua linie a fişierului se va scrie cel mai mare număr natural ce poate fi tipărit prin K puncte.

Restricții și precizări

10 ≤ N ≤ 1015
14 ≤ K ≤ 100000
Pentru rezolvarea corectă a cerinţei a) se acordă 30% din punctajul fiecărui test iar  pentru rezolvarea corectă a cerinţei b) se acordă 70% din punctajul fiecărui test.

Exemplul 1
imprimanta.in

2852 16
imprimanta.out

5
74
Explicație
Pentru tipărirea cifrei 2 s-au acţionat 11 ace, pentru cifra 8 s-au acţionat 13 ace iar pentru cifra 5 tot 11 ace. Numărul minim de ace pentru tipărirea unei cifre este 11.
5 este cea mai mare cifră a numărului 2852  ce a fost tipărită cu 11 ace.
Cel mai mare număr natural ce poate fi tipărit prin 16 puncte este 74
7 puncte (pentru cifra 7) + 9 puncte (pentru cifra 4) = 16 puncte.

Exemplul 2
imprimanta.in

88 25
imprimanta.out

8
11111
Explicație
Pentru tipărirea cifrei 8 s-au acţionat 13 ace.
Cel mai mare număr natural ce poate fi tipărit prin 25 de puncte este 11111 
5* (5 puncte pentru cifra 1) = 25 puncte.

## Cod sursă C++

```cpp
//Marinel Serban
//O(k)
#include <fstream>
using namespace std;
ifstream fin("imprimanta.in");
ofstream fout("imprimanta.out");
long long N, K, s_max, s;
int cifra, ace, min_ace = 25, max_cifra, i;
int main()
{
    fin >> N >> K;
//punctul a)
    while (N)
    {
        cifra = N % 10;
        N /= 10;
        switch (cifra)
        {
            case 0:
            case 6:
            case 9: ace = 12; break;
            case 1: ace = 5; break;
            case 2:
            case 3:
            case 5: ace = 11; break;
            case 4: ace = 9; break;
            case 7: ace = 7; break;
            case 8: ace = 13; break;
        }
        if (ace < min_ace)
        {
            min_ace = ace;
            switch (ace)
            {
                case 12: max_cifra = cifra; break;
                case 11: max_cifra = cifra; break;
                case 5: max_cifra = 1; break;
                case 7: max_cifra = 7; break;
                case 9: max_cifra = 4; break;
                case 13: max_cifra = 8; break;
            }
        }
        else
            if (ace == min_ace)
            switch (ace)
            {
                case 12: if (cifra>max_cifra) max_cifra = cifra; break;
                case 11: if (cifra>max_cifra) max_cifra = cifra; break;
            }
    }
    fout << max_cifra << '\n';
//punctul b)
    if (K % 5 == 0)
        for (i = 1; i <= K / 5; ++i) fout << 1;   //numai 1
    else
        if (K  % 5 == 1)
        {
            if (K == 16) fout << 74;              //caz particular
            else
            {
                fout << 777;                      //21 ace (3 * 7)
                for (i = 1; i <= (K - 21) / 5; ++i) fout << 1;//restul 1 (cate 5 ace)
            }
        }
        else
            if (K % 5 == 2)
            {
                fout << 7;                                     //7 ace (2+5)
                for (i = 1; i <= (K - 7) / 5; ++i) fout << 1;  //restul 1
            }
            else
                if (K % 5 == 3)
                {
                    fout << 8;                                      //13 ace (3+2*5)
                    for (i = 1; i <= (K  - 13)/ 5; ++i) fout << 1;  //restul 1
                }
                else
                {
                    fout << 77;                                    //9 ace (4+5)
                    for (i = 1; i <= (K - 14) / 5; ++i) fout << 1;
                }
    fout << '\n';
    fout.close();
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1045)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1045/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1045/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
