Rezolvare completă PbInfo #706 Fibosir

Prin fibosir(N) înţelegem un şir construit prin adăugarea la sfârşit (concatenare) a primilor N termeni nenuli ai şirul Fibonacci definit astfel:

  • F1=1
  • F2=1
  • FN = FN-1 + FN-2

De exemplu, dacă N=8 fibosir-ul construit este: fibosir(8)=1123581321.

Cerința

Pentru N valoare naturală dată, să se elimine din fibosir-ul construit M secvenţe disjuncte de lungime K fiecare, astfel încât numărul format din cifrele rămase în fiboşir să fie maxim.

Date de intrare

Fișierul de intrare fibosir.in conține pe prima linie trei numere naturale N, M şi K separate prin câte un spaţiu cu semnificaţia din enunţ.

Date de ieșire

Fișierul de ieșire fibosir.out va conține pe prima linie numărul maxim ce se obţine prin eliminarea a M secvenţe disjuncte de lungime K din fibosir(N).

Restricții și precizări

  • 0 < N ≤ 2000
  • 0 < M*K < lungimea fibosir(N)
  • Prin secvență de lungime K înțelegem un subșir de K cifre aflate pe poziţii consecutive în șir.

Exemplu

fibosir.in

8 3 2

fibosir.out

5821

Explicație

fiboşir(8): 1123581321
Sunt eliminate 3 secvențe de lungime 2: 11, 23, 13

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

# include <fstream>
# include <cstring>
# include <algorithm>
using namespace std;

ifstream f("fibosir.in");
ofstream g("fibosir.out");

int N, M, K, la, lb, lc;
char s[420001], a[500], b[500], c[500];

void add(char *a, char *b, char *c)
{
    int i = 0 , j = 0;
    int x, k, t;

    x = k = t = 0;
    while (i < la && j < lb)
    {
        x = (a[i] - 48) + (b[j] - 48) + t;
        c[k] = (x % 10) + 48;
        t = x/10;
        ++i; ++j; ++k;
    }
    while (i < la)
    {
        x = (a[i] - 48) + t;
        c[k] = (x % 10) + 48;
        t = x/10;
        ++i; ++k;
    }
    while (j < lb)
    {
        x = (b[j] - 48) + t;
        c[k] = (x % 10) + 48;
        t = x/10;
        ++j; ++k;
    }
    if (t)
    {
        c[k] = t + 48;
        ++k;
    }
    c[k] = '\0';
    lc = k;
}
int main()
{
    char max;
    int i, j, poz, nr;

    f >> N >> M >> K;

    //construim fibosir(n)
    a[0] = b[0] = s[0] = s[1] = '1';
    a[1] = b[1] = s[2] = '\0';
    la = lb = lc = 1;
    for (i=2; i<N; ++i)
    {
        add(a, b, c);
        memcpy(a, b, lb);
        memcpy(b, c, lc);
        reverse(c, c + lc);
        la = lb; lb = lc;
        strcat(s, c);
    }
    N = strlen(s);
    i = 0;
    while (i < N)
    {
        for (j=1, max = '0';  j<=M; ++j)
        {
            if (s[i + j*K] > max)
            {
                max = s[i + j*K];
                poz = j;
                if (max == '9') break;
            }
        }
        if (s[i] < max) // jump
        {
            i += (poz * K);
            M -= poz;
        }
        else
        {
            g << s[i++];
        }
    }
    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 #706 Fibosir

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