Rezolvare completă PbInfo #1380 pluton

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 Adresa de email.

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!