fbpx

Problema #2978 – aur – Rezolvari PBInfo

de Mihai-Alexandru

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:

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.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("aur.in");
ofstream cout("aur.out");

unsigned char a[900001];
int ind;
unsigned long long maxi;

int nrcif(int n)
{
    int c = 0;
    while(n != 0)
    {
        c++;
        n /= 10;
    }
    return c;
}

int ogl(int n)
{
    int ogl = 0;
    while(n != 0)
    {
        ogl = ogl * 10 + n % 10;
        n /= 10;
    }
    return ogl;
}
int main()
{
    long long cer , n , k , p , cnt = 0 , x;
    cin >> cer;
    if(cer == 1)
    {
        int sum = 0;
        cin >> n;
        for(int i = 1 ; i <= n ; i++)
            cin >> x , sum += nrcif(x);
        cout << sum;
    }
    else if(cer == 2)
    {
        cin >> n >> k;
        for(int i = 1 ; i <= n ; i++)
        {
            cin >> x;
            int og = ogl(x);
            while(x % 10 == 0) 
            {
                cnt++;
                x /= 10;
                if(cnt == k) cout << 0;
            }
            while(og != 0)
            {
                cnt++;
                if(cnt == k) cout << og % 10;
                og /= 10;
            }
        }
    }
    else
    {
        cin >> n >> p;
        for(int i = 1 ; i <= n ; i++)
        {
            cin >> x;
            int og = ogl(x) , l = 0;
            while(x % 10 == 0) l++ , x /= 10;
            while(og != 0)
            {
                a[++ind] = og % 10;
                og /= 10;
            }
            while(l)
                a[++ind] = 0 , l--;
        }
        for(int i = 1 ; i <= ind - p + 1; i++)
        {
            unsigned long long rez = 0;
            for(int j = 1 ; j <= p ; j++)
                    rez = rez * 10 + a[i+j-1];
            if(rez > maxi) maxi = rez;
        }
        cout << maxi;
    }
}
Comentarii

S-ar putea sa iti placa