Rezolvare completă PbInfo #1045 Imprimanta

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.

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

//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;
}

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 #1045 Imprimanta

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