Rezolvare completă PbInfo #2965 album

Victor și Radu sunt frați. Mama le-a adus n stickere cu fotbaliști, fiecare sticker având imprimat pe spate un cod, un număr cuprins între 10 și 999 999. Frații, dorind cât mai multe stickere pe care să le lipească în albumul propriu, au început să se certe. Mama le propune următorul mod de împărțire a stickerelor: ea aranjează cele n stickere în linie, cu fața în jos, iar apoi fiecare frate, pe rând, va lua primul sticker disponibil, precum și toate stickerele care conțin două cifre care sunt egale cu cele mai mari două cifre, nu neapărat distincte, dintre cele scrise pe primul sticker luat la această etapă. Stickerele sunt disponibile începând de la stânga la dreapta. Fiind cel mai mic, Victor va fi primul, apoi copiii iau stickere alternativ, până când nu mai sunt stickere. La final, fiecare copil numără câte stickere are în total.

Cerințe

Cunoscându-se numărul n de stickere aduse de mama și numerele de pe ele în ordinea în care sunt așezate pe masă, să se determine:

1. Cele mai mari două cifre, nu neapărat distincte, de pe ultimul sticker aflat pe masă înainte de începerea concursului;
2. Fratele care câștigă concursul și câte stickere are.

Date de intrare

Fișierul de intrare album.in conține pe prima linie o cifră c care poate să fie doar 1 sau 2. Pe a doua linie se găsește n reprezentând numărul de stickere. Pe a treia linie se află n numere naturale separate prin câte un spațiu, reprezentând numerele de pe stickere.

Date de ieșire

Dacă valoarea lui c este 1, atunci se va rezolva numai punctul 1 din cerință. În acest caz, fișierul de ieșire album.out va conține pe prima linie, în ordine crescătoare, cifrele cerute.

Dacă valoarea lui c este 2, atunci se va rezolva numai punctul 2 din cerință. În acest caz, fişierul de ieşire album.out va conține pe prima linie litera V dacă Victor are mai multe stickere, litera R dacă Radu are mai multe stickere, sau literele V și R separate prin exact un spațiu dacă amândoi au același număr de stickere. Pe a doua linie se va scrie numărul de stickere ale celui care are cele mai multe sau numărul de stickere deținut de fiecare, în cazul în care au același număr de stickere.

Restricții și precizări

  • 3 ≤ n ≤ 800 000;
  • Pentru cerința 2 se garantează că, pentru 50% din teste, n ≤ 100;
  • Rezolvarea cerinței 1 garantează 40p, iar cerința 2 garantează 50p;
  • În concurs au fost acordate 10p din oficiu. Pe site se cere rezolvarea exemplelor.

Exemple:

album.in

1
7
291 11 992 456 71 13 121

album.out

1 2

Explicație

Cerința este 1. Pe ultimul sticker de pe masă este scris numărul 121, care are cele mai mari două cifre 1 și 2.

album.in

2
7
234 122 334 199 463 221 231 

album.out

V
4

Explicație

Cerința este 2. Victor începe concursul și ia stickerele 234 (cu 3 și 4 cele mai mari două cifre), 334 și 463. Pe masă rămân stickerele 122 199 221 231. Continuă Radu, care ia stickerele cu numerele 122 (cu cele mai mari două cifre 2 și 2) și 221. Rămân stickerele 199 și 231. Victor mai ia stickerul cu numărul 199, apoi Radu ia stickerul cu numărul 231. Victor câștigă cu 4 stickere, Radu având doar 3.

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

//autor: prof. Liviu Pinzaru, Palatul Copiilor Suceava & Clubul Copiilor Falticeni
#include <fstream>
using namespace std;
int v[8],ord[100];
short int w[10];

int main()
{
    ifstream f("album.in");
    ofstream g("album.out");

    int i,j,N,n,x,z,poz=0,Mm=0,ii,ORD;
    int p;
    char a[20];
    int V=0,R=0;

    f>>p;
    f>>N;

    if(p==1)
    {
        for(ii=1;ii<=N;++ii)
            f>>a;
        for(j=0;a[j];++j)
        {
            x=a[j]-'0';
            w[x]++;
        }
        i=0;
        for(j=9;j>=0 ;--j)
        {
            if(w[j]>=1)
                v[++i]=j;
        }
        x=v[1];
        if(w[x]>1)
            g<<x<<" "<<x;
        else
            g<<v[2]<<" "<<v[1];

        return 0;
    }


    for(ii=1;ii<=N;++ii)
    {
        f>>a;
        //g<<a<<'\n';

        for(j=0;j<=9;++j)
            w[j]=0;

        for(j=0;a[j];++j)
        {
            x=a[j]-'0';
            w[x]++;
        }

        i=0;
        for(j=9;j>=0 ;--j)
        {
            if(w[j]>=1)
                v[++i]=j;
        }
        n=i;

        x=v[1];
        if(w[x]>1)
            Mm=x*10+x;
        else
            Mm=v[1]*10+v[2];

        //g<<Mm<<'\n';

            ORD=1234567;

            for(i=1;i<=n;++i)  //verificam dublurile
            {
                x=v[i];
                if(w[x]>1)
                {
                    z=x*10+x;
                    //g<<z<<'\n';
                    //cautam cel mai mic ordin
                    if(ord[z]>0) //daca numarul z a mai fost
                    {
                        if(ord[z]<ORD)
                            ORD=ord[z];
                    }
                }
            }

            for(i=1;i<n;i++)
                for(j=i+1;j<=n;j++)
                {
                    z=v[i]*10+v[j];
                    //g<<z<<'\n';
                    //cautam cel mai mic ordin
                    if(ord[z]>0) //daca a mai fost
                    {
                        if(ord[z]<ORD)
                            ORD=ord[z];
                    }
                }

            if(ORD==1234567)  //se creaza un nou ordin
            {
                ++poz;
                ord[Mm]=poz;
                ORD=poz;
                //g<<"alt ordin:"<<ORD<<'\n';
                if(poz%2) V++;
                else R++;

            }
            else  //s-a aderat la ordinul ORD
            {
                if(ORD%2) V++;
                else R++;
            }

            //g<<"V="<<V<<" R="<<R<<" poz="<<poz<<" ORD="<<ORD<<'\n';
    }


if(V>R)
    g<<"V"<<'\n'<<V;
else if(R>V)
    g<<"R"<<'\n'<<R;
else //if(V==R)
   g<<"V R"<<'\n'<<V;


    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 #2965 album

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