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ă, pentru50%
din teste,n ≤ 100
; - Rezolvarea cerinței
1
garantează40p
, iar cerința2
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 .
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!