Rezolvare completă PbInfo #2978 aur

După ce au mers împreună prin lume, Păcală și Tândală au strâns o căruță plină de bănuți de aur, iar acum îi răstoarnă pe toți în curtea casei și îi împart în N grămezi. Păcală numără bănuții din fiecare grămadă și îi dictează lui Tândală N numere naturale pe care acesta trebuie să le scrie în ordine pe o tăbliță. După ore bune de muncă, Păcală constată că Tândală a scris pe un singur rând, în ordine, de la stânga la dreapta, toate numerele dictate de el, dar lipite unul de altul. Acum pe tăbliță e doar un șir lung de cifre. Ce să facă Păcală acum?

Cerința

Cunoscând cele N numere naturale dictate de Păcală, scrieți un program care să determine:
1. numărul cifrelor scrise pe tăbliță de Tândală;
2. ce-a de-a K-a cifră de pe tăbliță, în ordine de la stânga la dreapta;
3. cel mai mare număr ce se poate forma cu exact P cifre alăturate de pe tăbliță, considerate în ordine de la stânga la dreapta.

Date de intrare

Fișierul de intrare aur.in conţine:
- pe prima linie un număr natural C care reprezintă numărul cerinței și poate avea valorile 1, 2 sau 3.
- pe cea de-a doua linie un număr natural N dacă cerința este 1, sau două numere naturale N și K (despărțite printr-un spațiu) dacă cerința este 2, sau două numere naturale N și P (despărțite printr-un spațiu) dacă cerința este 3.
- pe cea de-a treia linie, N numere naturale despărțite prin câte un spațiu, ce reprezintă, în ordine, numerele pe care Păcală i le dictează lui Tândală.

Date de ieșire

Fișierul de ieșire aur.out va conține pe prima linie un singur număr natural ce reprezintă rezultatul determinat conform fiecărei cerințe.

Restricții și precizări

  • 1 ≤ N ≤ 100.000 și 1 ≤ K ≤ 900.000;
  • Se garantează ca există cel puțin K cifre scrise pe tăbliță.
  • 1 ≤ P ≤ 18; Se garantează ca există cel puțin P cifre scrise pe tăbliță.
  • toate numere dictate de Păcală sunt nenule și au cel mult 9 cifre fiecare;
  • Pentru rezolvarea corectă a primei cerințe se acordă 20 de puncte, pentru rezolvarea corectă a celei de-a doua cerințe se acordă 30 de puncte, iar pentru rezolvarea corectă a celei de-a treia cerințe se acordă 40 de puncte.
  • În concurs s-au acordat 10 puncte din oficiu. Aici se acordă pentru exemplele din enunț.

Exemplul 1:

aur.in

1
7
25 9 13 459 2 79 9

aur.out

12

Explicație

Se rezolvă cerința 1. Tândală a scris pe tăbliță: 259134592799. Numărul cifrelor scrise de Tândală este 12.

Exemplul 2:

aur.in

2
7 10
25 9 13 459 2 79 9

aur.out

7

Explicație

Se rezolvă cerința 2. N are valoarea 7 și K are valoarea 10. Pe tăbliță este scris: 259134592799, cea de-a zecea cifră este 7.

Exemplul 3:

aur.in

3
7 4
25 9 13 459 2 79 9

aur.out

9279

Explicație

Se rezolvă cerința 3. N are valoarea 7 și P are valoarea 4. Tândală a scris pe tăbliță: 259134592799. Cel mai mare număr format din patru cifre este 9279.

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

#include <stdio.h>
#include <stdlib.h>

int Test, N, cifra, nc, x,  P, T, i, y ,nr, nz;
long long Max, p, nrc;

int main()
{
    freopen ("aur.in", "r", stdin);
    freopen ("aur.out", "w", stdout);
    scanf("%d\n%d", &Test, &N);
    if(Test >= 2) scanf("%d\n", &T);
    if(Test == 3) P = T;

    p = 1;

    for (i = 1; i <= N; i++)
    {
        scanf("%d", &x); y = nz = 0;
        while (x %10 == 0) {nc++; x/=10; nz++;}
        while (x)
        {
            nc++;
            y = y*10 + x%10;
            x/=10;
        }
         while(y){
            nr++;
            if(nr==T) cifra=y%10;
            if(nr<=P)
            {
                nrc = nrc*10+y%10;
                p*=10;
            }
            if(nr==P)
            {
                p/=10;
                Max=nrc;
            }
            if(nr>P)
                nrc = nrc%p *10 + y%10;
            if(nrc>Max) Max = nrc;
            y/=10;
        }
        while (nz){
            nr++;
            if(nr==T) cifra=0;
            if(nr<=P)
            {
                nrc = nrc*10;
                p*=10;
            }
            if(nr==P)
            {
                p/=10;
                Max=nrc;
            }
            if(nr>P)
                nrc = nrc%p *10;
            if(nrc>Max) Max = nrc;
            nz--;
        }
    }

    if(Test==1)printf("%d\n", nc);
    if(Test==2)printf("%d\n", cifra);
    if(Test==3)printf("%lld\n", Max);

    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 #2978 aur

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