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:
F
1
=1
F
2
=1
F
N
= F
N-1
+ F
N-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 <
lungimeafibosir(N)
- Prin secvență de lungime
K
înțelegem un subșir deK
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 .
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!