Sunteți pe pagina 1din 8

CENTRUL DE EXCELENȚĂ ÎN INFORMATICĂ

ȘI TEHNOLOGII INFORMAȚIONALE

Disciplina: Programarea Calculatorului

Lucru Individual Nr.2

Tema: Tehnici de Programare

Elaborat : Grițcu Bogdan


Profesor : Frunză Olga

Chișinău, 2023
17. Recruţii. În prima zi de armată, la ordinul comandantului, cei N recruţi sau aranjat
în rând. Comandantul suferă ori de câte ori lucrurile nu sunt în perfectă ordine, iar şirul
format de recruţi era complet dezordonat. Din acest motiv, comandantul solicită ca un
număr minim de recruţi să iasă din rând astfel încât soldaţii rămaşi în rând să fie în ordine
strict crescătoare a înălţimilor.
Date de intrare. Fişierul de intrare recruti.in conţine pe prima linie numărul natural N,
reprezentând numărul de recruţi. Pe cea de a doua linie, se află N numere reale separate
prin câte un spaţiu, reprezentând înălţimile recruţilor, în ordinea în care aceștia sau plasat
iniţial în rând.
Date de ieşire.n Fişierul de ieşire recruti.out va conţine pe prima linie un număr natural
Lg, reprezentând numărul de recruţi rămaşi în rând. Pe cea de a doua linie vor fi afişate Lg
numere reale separate prin câte un spaţiu, reprezentând înălţimile recruţilor rămaşi în rând.

#include <iostream>
#include <fstream>
#include <ctime>

using namespace std;

struct Recrut {
double inaltime;
int index;
};

void sortare(Recrut arr[], int n) {


for (int i = 0; i < n - 1; ++i)
for (int j = 0; j < n - i - 1; ++j)
if (arr[j].inaltime > arr[j + 1].inaltime || (arr[j].inaltime == arr[j +
1].inaltime && arr[j].index > arr[j + 1].index)) {

Recrut temp = arr[j];


arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}

void elimina(int current, int N, Recrut recruti[], bool eliminat[], int&


Nr_eliminati) {
if (current == N)
return;

if (recruti[current].index != current) {
eliminat[recruti[current].index] = true;
++Nr_eliminati;
}

elimina(current + 1, N, recruti, eliminat, Nr_eliminati);


}

int main() {
time_t start = time(nullptr);
ifstream fin("recruti.in");
ofstream fout("recruti.out");

int N;
fin >> N;

Recrut recruti[100];
for (int i = 0; i < N; ++i) {
fin >> recruti[i].inaltime;
recruti[i].index = i;
}

sortare(recruti, N);

bool eliminat[100] = {false};


int Nr_eliminati = 0;
elimina(0, N, recruti, eliminat, Nr_eliminati);

fout << N - Nr_eliminati << endl;


for (int i = 0; i < N; ++i)
if (!eliminat[i]) fout << recruti[i].inaltime << " ";

time_t final = time(nullptr);

double executie = final - start;

cout << "Timpul de executie: "<<fixed<< executie << " secunde" << endl;

return 0;
}

Date de intrare
Date de ieșire

Am definit un struct ”Recrut” ce conține 2 câmpuri ( înălțime & index).

Apoi am creat o funcție ce sortează un vector prin metoda bulelor.

Am creat o funcție ce elimină recruții care nu sunt în ordinea corectă după


înălțime folosind backtracking.
În funcția main am inițializat variabilele și am apelat funcțiile. De asemenea am
luat datele de intrare din fișierul ”recruti.in” si rezultat l-am afișat în fișierul
”recruti.out”
Variabila start și final sunt pentru a calcula diferența între timpul la care a
început programul și până când s-a terminat pentru a putea deduce timpul de
execuție.

Din cauza numărului de date mic, programul rulează în 0.000000 secunde.

Am încercat să rulez programul și cu un număr mai mare de date (100)

Concluzie:Metoda backtracking este o metodă eficientă de a rezolva


probleme,observând că și cu un număr mai mare de date se descurcă fără
dificultăți,însă depinde de complexitatea problemii/algoritmului,deoarece
necesită o analiză și o abordare atentă a problemei.

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