Enunt
În timpul acţiunii “Furtuna în deşert” din cauza unei furtuni de nisip, n
soldaţi s-au rătăcit de plutoanele lor. După trecerea furtunii se pune problema regrupării acestora pe plutoane. Pentru aceasta se folosesc plăcuţele de identificare pe care soldaţii le poartă la gât. Pe aceste plăcuţe sunt scrise numere care pot identifica fiecare soldat şi plutonul din care acesta face parte. Astfel, soldaţii din acelaşi pluton au numărul de identificare format din aceleaşi cifre, dispuse în altă ordine şi numerele de identificare sunt unice. De exemplu, numerele de identificare 78003433
, 83043073
, 33347008
indică faptul ca cei trei soldaţi care le poartă fac parte din acelaşi pluton.
Cerința
Fiind date cele n
numere de pe plăcuţele de identificare, să se regrupeze cei n
soldaţi pe plutoane, indicându-se numărul de plutoane găsite (un pluton refăcut trebuie să aibă minimum un soldat), numărul de soldaţi din cel mai numeros pluton, numărul de plutoane care au acest număr maxim de soldaţi precum şi componenţa unui astfel de pluton (cu număr maxim de soldaţi regrupaţi).
Date de intrare
Fişierul de intrare pluton.in
conţine pe prima linie numărul n
de soldaţi recuperaţi, iar pe fiecare dintre următoarele n
linii câte un număr de identificare a celor n
soldaţi.
Date de ieșire
Fişierul de ieşire pluton.out
va conţine pe prima linie numărul de plutoane refăcute. Linia a doua va conţine numărul de soldaţi din cel mai numeros pluton refăcut. Linia a treia va conţine numărul de plutoane care au numărul maxim de soldaţi recuperaţi. Linia a patra va conţine componenţa unui astfel de pluton, cu număr maxim de soldaţi recuperaţi, numerele de identificare ale soldaţilor din componenţă fiind scrise unul după altul separate prin câte un spaţiu.
Restricții și precizări
0 < n ≤ 4000
0 ≤
număr de identificare< 2.000.000.000
Exemplu
pluton.in
10 1223 123 666 321 7890 2213 312 655 1000 1322
pluton.out
6 3 2 321 312 123
Explicație
Au fost recuperaţi soldaţi din 6
plutoane distincte, cei mai mulţi soldaţi recuperaţi dintr-un pluton fiind în număr de 3
. Există 2
plutoane cu număr maxim de soldaţi recuperaţi (3)
, unul dintre ele fiind format din soldaţii cu numerele 321 312 123
. De remarcat că şi soluţia 1223 2213 1322
este corectă.
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 pluton:
#include<fstream>
using namespace std;
long Nr[4001];//Nr[k]=nr de identificare al soldatului k
long NrSort[4001];//NrSort[k]=nr de identificare al soldatului k
//avand cifrele asezate in ordine descrescatoare - cu ajutorul
//acestui vector se va verifica rapid daca doi soldati i si j fac
//parte din acelasi pluton (adica au numerele de identificare
//Nr[i] si Nr[j] formate din acelasi cifre, insa in alta ordine)
//deoarece este suficient sa testam daca NrSort[i]=NrSort[j]
long n; //numarul de soldati
long nrp; //numarul de plutoane refacute
long Max; //numarul maxim de soldati dintr-un pluton refacut
long nrmax;//numarul de plutoane refacute cu numar maxim de soldati (Max)
long SortareCifre(long x) //functia intoarce numarul obtinut prin asezarea
{ //in ordine descrescatoare a cifrelor numarului x
long aux,c,y; //de exemplu SortareCifre(2810831)=8832110
aux=x; //in aux se salveaza valoarea initiala a numarului x
y=0;
for(c=9;c>=0;c--) //se considera pe rand fiecare cifra c de la 9 la 0
{
while(x) //se ia pe rand fiecare cifra din numarul x
{ //si daca ea este egala cu c se alipeste la
if(x%10==c) y=y*10+x%10; //un alt numar y - astfel numarul y va avea
x=x/10; //la sfarsit aceleasi cifre ca si numarul x,
} //insa asezate in ordine descrescatoare
x=aux; //se reface valoarea initiala a lui x
}
return y;
}
int main()
{
long i,j,p,pmax;
long aux;
fstream f;
f.open("pluton.in",ios::in);
f>>n; //se citesc din fisierul pluton.in numarul n si
for(i=1;i<=n;i++) //elementele vectorului Nr si se completeaza valorile
{ //corespunzatoare in vectorul NrSort
f>>Nr[i];
NrSort[i]=SortareCifre(Nr[i]);
}
f.close();
i=1; //pozitia curenta din vectori Nr si NrSort(soldatul curent i)
nrp=nrmax=Max=0;
while(i<=n)
{
p=i; //se salveaza pozitia curenta i in variabila p
j=i+1; //se cauta soldati j din acelasi pluton cu soldatul curent i
while(j<=n) //adica soldati pentru care NrSort[j]=NrSort[i]
{
if(NrSort[i]==NrSort[j]) //in cazul in care se gaseste un astfel de soldat
{ //acesta este adus langa soldatul curent i
i++;
aux=Nr[i]; Nr[i]=Nr[j]; Nr[j]=aux;
aux=NrSort[i]; NrSort[i]=NrSort[j]; NrSort[j]=aux;
}
j++;
}
i++; //s-au adus langa soldatul i toti posibilii sai colegi de pluton
nrp++; //deci s-a mai refacut un pluton intre pozitiile p si i-1 din
//cei doi vectori Nr si NrSort
if(i-p>Max) //daca numarul de soldati din ultimul pluton refacut (adica i-p)
{ //este mai mare strict decat Max se actualizeaza valorile
Max=i-p; //variabilelor Max si nrmax
nrmax=1;
pmax=p; //pmax retine pozitia la care incepe in vectorul Nr plutonul
} //cu numar maxim de soldati
else
if(i-p==Max) nrmax++; //daca numarul de soldati din ultimul pluton refacut
} //este egal cu Max se actualizeaza valoarea lui nrmax
f.open("pluton.out",ios::out); //se scriu in fisierul pluton.out rezultatele
f<<nrp<<endl<<Max<<endl<<nrmax<<endl;
for(i=pmax;i<pmax+Max;i++) f<<Nr[i]<<" ";
f.close();
}
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 #1380 pluton
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1380 pluton 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!