Informatică, întrebare adresată de lilianacamelia75, 8 ani în urmă

Cioc
Cioc, un elev abia aterizat în clasa a IX-a, primește de la doamna profesor de informatică un șir de n numere naturale pe care trebuie să îl prelucreze. Astfel, băiatul trebuie să scrie după fiecare dintre cele k cele mai mici elemente dublul lor. Dacă cel mai mare dintre aceste numere se repetă și deja se depășesc cele k elemente prevăzute, doamna profesor îi dă libertatea băiatului de a modifica valoarea lui k astfel încât să cuprindă și aceste valori. De exemplu, dacă n = 7, v[] = {1, 4, 6, 2, 3, 4, 5} și k = 4, atunci, în urma prelucrării, șirul v devine {1, 2, 4, 8, 6, 2, 4, 3, 6, 4, 8, 5}, și deci kfinal=5.

Cerința
Cunoscându-se n, șirul v și k, să se afișeze:

1. Numărul kfinal;
2. Vectorul după prelucrare.
Date de intrare
Fișierul de intrare cioc.in conține pe prima linie numerele c (mereu 1 sau 2, reprezentând cerința ce trebuie rezolvată), n, k, iar următoarea linie va conține n numere întregi, reprezentând elementele vectorului inițial.

Date de ieșire
Fișierul de ieșire cioc.out va conține pe prima linie:

Dacă c = 1, atunci numărul kfinal;
Dacă c = 2, atunci vectorul după prelucrare.
Restricții și precizări
1 ≤ n, k ≤ 100.000;
1≤v[i]≤260;
Pentru 40% din teste, c=1.



Exemplu
cioc.in

1 7 4
1 4 6 2 3 4 5
cioc.out

5
Explicație
k-ul inițial nu este suficient de cuprinzător (numărul 4 se repetă).

cioc.in

2 7 4
1 4 6 2 3 4 5
cioc.out

1 2 4 8 6 2 4 3 6 4 8 5
Explicație
Acesta este exemplul din enunț.


boiustef: poate cineva propune rezolvare cu Divide et Impera... dar eu am propus numai sortare în alt fişier, pentru nu a schimba structura datelor de intrare

Răspunsuri la întrebare

Răspuns de boiustef
5

Răspuns:

#include <iostream>

#include <fstream>

#include <algorithm>

using namespace std;

ifstream fin("cioc.in");

ofstream fout("cioc.out");

int n,i,k,c, kfinal;

long long v[100002], a[100002], maxk;

int main()

{

   fin >> c >> n >> k;

   for (i=0; i<n; ++i)

   {

       fin >> v[i];

       a[i]=v[i];

   }

   sort(a, a+n);

   while (a[k]==a[k-1] && k<n) ++k;

   kfinal=k; maxk=a[k-1];

   if (c==1) fout << kfinal;

   else

   {

       for (i=0; i<n; ++i)

       {

           fout << v[i] << " ";

           if (v[i]<=maxk) fout << 2*v[i] << " ";

       }

   }

}

Explicație:

100 f.f. proaspăt.. :))) Nu am aplicat Divide et Impera şi a mers rapid

Răspuns de CinevaFaraNume
2

#include <fstream>// ifstream si ofstream

#include <algorithm>// sort()

using namespace std;

long long vec[100001]; // vectorul initial

long long srtvec[100001]; // vectorul sortat

long long mod[200001]; // vectorul modificat

int main(){

   int c,n,k;

   ifstream fin("cioc.in");

   ofstream fout("cioc.out");

   fin >> c >> n >> k;

   for(int i = 1; i <= n; i++){

       fin >> vec[i];

       srtvec[i] = vec[i];

   }

   fin.close();

   sort(&srtvec[1], &srtvec[n+1]);

   if(c==1){

       int kf = k;

       long long v = srtvec[k];

       while(srtvec[++kf] == v);

       fout << --kf;

   }else{//c=2

       long long int vm = srtvec[k];

       int poz = 0;

       for(int i = 1; i <= n; i++){

           mod[poz++] = vec[i];

           if(vec[i] <= vm){

               mod[poz++] = vec[i] * 2;

           }

       }

       for(int i = 0; i < poz; i++){

        fout << mod[i] << ' ';

       }

   }

   fout.close();

}


boiustef: :))) îl cunoşti pe fotbalistul brazilian Ronaldinio (cred nu am scris corect numele)
CinevaFaraNume: Nu
boiustef: eu îi spun extraterestru după talentul pe care îl demonstrează pe teren. Ţie tot aşa ţi-am zis... :)))
boiustef: o zi frumoasă!
CinevaFaraNume: Multumesc,la fel
boiustef: https://ro.wikipedia.org/wiki/Ronaldinho
GabiAlex99: :)))..CinevaFaraNume am si eu o curiozitate.. esti/sunteti student sau profesor?
CinevaFaraNume: Sunt doar un elev care trece a 10-a
GabiAlex99: Atunci ce sa zic, felicitari :)).. Ai fost la vreo olimpiada pana acum la info?
CinevaFaraNume: Da
Alte întrebări interesante