Sunteți pe pagina 1din 2

Soluţia problemei – ordine

prof. Marinel Serban

Colegiul Național „Emil Racovita” Iasi

Prin sistemul de formare a şirului descris în enunţ, bilele luate de pe masă prima, a treia, a cincia, etc.
sunt primele în şir, urmate de bilele luate a doua, a patra, a şasea, etc. Astfel:

- bila a 3-a se pune după prima bilă, deoarece se pune la mijloc, între primele 2 bile luate
- bila a 5-a se pune după primele două bile, deoarece se pune la mijloc, între primele 4
- bila a 7-a se pune după primele trei bile, deoarece se pune la mijloc, între primele 6
- ...
iar

- bila a 2-a se pune pe poziţia 2 (după prima bilă la început), apoi la fiecare bilă cu număr de
ordine impar se deplasează cu câte o poziţie spre dreapta, ceea ce înseamnă că în final va ajunge
pe poziţia n/2+1 (prima poziţie după mijloc)
- bila a 4-a se pune după bila a doua, apoi ...
Deci, dacă şirul final conţine bilele cu numerele a1 a2 a3 ... an, atunci aceste valori se distribuie în
şirul cerut (b) astfel

1 2 3 4 5 6 7 8 ... n

b= a1 a2 a3 a4 etc.

şi apoi

1 2 3 4 5 6 7 8 n

b= ak ak+1 ak+2 ak+3 etc.

unde k=n/2+1

Răspunsul la cerinţa 1 este an dacă n este par, respectiv an/2+1 dacă n este impar.

Implementare 1 - O(n)
Citirea se face direct în vectorul b, respectând cele arătate mai sus

Implementare 2 - O(2n)
Citirea se face în vectorul a, apoi, respectând cele arătate mai sus, se construieşte vectorul b

Implementare 3 - O(n2)
Citirea se face în vectorul a, apoi se reface vectorul iniţial în vectorul b, simulând mutările bilelor
//serban marinel decembrie 2014
//cu 1 vector - direct din citire O(n)
#include <fstream>

using namespace std;

#define DIM 1000001

ifstream fin("ordine.in");
ofstream fout("ordine.out");

int b[DIM];
int n, i, j, tip;

int main()
{
//citire date de intrare
fin >> n;
j = 1;
for (i = 1; i <= n; ++i)
{
fin >> b[j];
j += 2;
if (j > n) j = 2;
}
fin >> tip;
if (tip == 2) //rezolv cerinta 2
//afisez rezultatul
for (i = 1; i <= n; ++i) fout << b[i] << ' ';
else //rezolv cerinta 1
fout << b[n]; //e ultima bila
fout << '\n';
return 0;
}

S-ar putea să vă placă și