Regele Rufus dorește să stabilească moștenitorul averii sale, adică să ofere parola de la seif celui mai deștept dintre fiii săi. Inițial, regele a avut parola X
formată din N
cifre nenule și un cod cheie Q
(număr natural cu exact nouă cifre, distincte, toate nenule). În fiecare an din cei K
ani de domnie, folosind codul cheie Q
, Rufus a modificat câte o secvență de cifre din parolă ajungând la parola finală P
.Pentru fiecare secvență se cunoaște poziția S
a primei cifre din secvență și poziția D
a ultimei cifre din secvență. Astfel, secvența este formată din cifrele situate pe pozițiile S
, S+1
, S+2
,…, D
în parola X
.
Modificarea unei secvențe din X
constă în înlocuirea fiecărei apariții a cifrei 1
cu prima cifră a lui Q
, apoi a fiecărei apariții a cifrei 2
cu a doua cifră a lui Q
,…, a fiecărei apariții a cifrei 9
cu ultima cifră a lui Q
.
Pentru a decide moștenitorul, regele le dă fiilor parola finală P
, codul cheie Q
, numărul K
de ani de domnie și cele K
secvențe de cifre care au fost modificate și le cere să găsească: parola inițială X
, poziția minimă Z
din parola X
care a apărut în cele mai multe secvențe dintre cele modificate de rege de-a lungul celor K
ani de domnie și cifrele distincte care au ocupat poziția Z
în cei K
ani.
Cerința
Scrieți un program care citește numerele Q
, N
, K
, cele N
cifre ale parolei finale P
și cele K
perechi de poziții S
și D
, și care rezolvă următoarele două cerințe:
- determină parola inițială
X
; - determină poziția minimă
Z
și cifrele distincte care au ocupat această poziție în ceiK
ani de domnie.
Date de intrare
Fișierul de intrare mostenire.in
conține pe prima linie un număr natural C
reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). A doua linie din fișier conține cele trei numere naturale Q
, N
și K
, separate prin câte un spațiu. A treia linie din fișier conține cele N
cifre ale parolei finale P
, separate prin câte un spațiu. Fiecare linie dintre următoarele K
, conține câte două numere naturale S
și D
, separate printr-un singur spațiu, reprezentând câte o pereche de poziții.
Date de ieșire
Dacă C=1
, fișierul de ieșire mostenire.out
va conține pe prima linie cele N
cifre ale parolei inițiale X
, separate prin câte un spațiu, în ordinea în care apar în X
, reprezentând răspunsul la cerința 1.
Dacă C=2
, fișierul de ieșire mostenire.out
va conține pe prima linie numărul natural Z
, iar pe a doua linie cifrele distincte care au apărut pe poziția minimă Z
, reprezentând răspunsul la cerința 2. Acestea vor fi afișate în ordine crescătoare, separate prin câte un spațiu.
Restricții și precizări
1 ≤ N ≤ 10 000
- numărul natural
Q
este format din exact 9 cifre, distincte și nenule - pozițiile cifrelor din parola
X
sunt numerotate cu numerele distincte consecutive1,2,...,N
1 ≤ K ≤ 100
- pentru toate perechile de poziții modificate de rege:
S ≤ D
- cel puțin o cifră din parola
X
va fi înlocuită - pentru rezolvarea corectă a cerinței 1 se acordă 50 de puncte
- pentru rezolvarea corectă a cerinței 2 se acordă 50 de puncte.
Exemplu 1:
mostenire.in
1 712534698 12 4 1 4 7 1 3 4 7 1 4 8 1 8 2 4 6 11 3 9 1 7
mostenire.out
2 7 3 5 4 1 3 3 7 9 2 8
Explicație
Exemplu 2:
mostenire.in
2 712534698 12 4 1 4 7 1 3 4 7 1 4 8 1 8 2 4 6 11 3 9 1 7
mostenire.out
3 1 2 3 7
Explicație
Cerința este 2, N=12
, K=4
. P=(1 4 7 1 3 4 7 1 4 8 1 8)
Pozițiile care au apărut în cele mai multe secvențe sunt: 3,4,6,7 => Z=3, iar cifrele distincte care au ocupat succesiv această poziție sunt 3
, 2
, 1
, 7
. Aceste cifre se vor scrie în fișier în ordine crescătoare
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 mostenire:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("mostenire.in");
ofstream g("mostenire.out");
int C,N,Q,K,S,D,Z,i,x,v[10001],cod[10],app[10],t,ap[10001],maxim;
int main()
{
f>>C;
f>>Q>>N>>K;
for(i=1; i<=N; i++)
{
f>>v[i];
}
for(i=9; i>=1; i--)
{
cod[i]=Q%10;
Q=Q/10;
}
if(C==1)
{
for(i=1; i<=K; i++)
{
f>>S>>D;
for(x=S; x<=D; x++)
{
{
for(t=1; t<=9; t++)
if(cod[t]==v[x])
{
v[x]=t;
break;
}
}
}
}
for(i=1; i<=N; i++)
g<<v[i]<<" ";
}
if(C==2)
{
for(i=1; i<=K; i++)
{
f>>S>>D;
for(x=S; x<=D; x++)
ap[x]++;
}
for(i=1; i<=N; i++)
if(ap[i]>maxim)
{
maxim=ap[i];
Z=i;
}
app[v[Z]]=1;
for(i=1; i<=maxim; i++)
{
for(t=1; t<=9; t++)
if(cod[t]==v[Z])
{
v[Z]=t;
app[t]++;
break;
}
}
g<<Z<<endl;
for(i=1; i<=9; i++)
if(app[i])
g<<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 #2570 mostenire
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2570 mostenire 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!