Rezolvare completă PbInfo #2570 mostenire

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:

  1. determină parola inițială X;
  2. determină poziția minimă Z și cifrele distincte care au ocupat această poziție în cei K 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 consecutive 1,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 Adresa de email.

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!