Programul de mai jos citește din fișierul input.txt un vector de elemente întregi și construiește în memorie (apoi scrie în fișierul output.txt) un vector care conține aceleași elemente, doar că având toate elementele egale cu 0 la final. Ordinea celorlalte elemente se păstrează.
Programul dă întotdeuna rezultatul corect, însă este ineficient din punctul de vedere al timpului de execuție.
Cerința
Rolul vostru este acela de a optimiza programul, astfel încât acesta să se execute în limita de timp indicată în enunț, pentru un vector de cel mult 1 milion de elemente. Limita de memorie trebuie, de asemenea, respectată. În acest sens, este permisă modificarea (oricât de radicală) a funcției nule. Orice modificare în afara corpului acestei funcții va conduce la respingerea soluței.
Date de intrare
Fișierul de intrare input.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.
Date de ieșire
Fișierul de ieșire output.txt va conține pe prima linie numărul n, iar pe a doua linie elementele vectorului generat.
Restricții și precizări
1 ≤ n ≤ 1.000.000
Important
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce la erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.
void nule(std::vector<int> &v)
{
...
}
Exemplu
input.txt
10 0 3 8 0 0 3 8 7 0 10
output.txt
10 3 8 3 8 7 10 0 0 0 0
Codul programului
/*
Acadnet 2017 - Etapa Interjudeteana
Problema A - Optimize Nule
*/
#include <iostream>
#include <vector>
#include <fstream>
#include <stdlib.h>
#define INPUT_FILENAME "input.txt"
#define OUTPUT_FILENAME "output.txt"
/*
Aceasta este singura functie pe care aveti
voie sa o modificati / rescrieti.
*/
void nule(std::vector<int> &v)
{
int i, j, aux, size = v.size();
bool swaped;
for(i = 0; i < size - 1; i++) {
swaped = false;
for(j = 0; j < size - i - 1; j++) {
if(v[j] == 0) {
aux = v[j];
v[j] = v[j+1];
v[j+1] = aux;
swaped = true;
}
}
if(!swaped)
break;
}
}
int main(void)
{
std::vector<int> v;
int size, i, x;
std::ifstream input_file;
std::ofstream output_file;
// Read vector from input file
input_file.open(INPUT_FILENAME);
if(!input_file.good()) {
std::cout << "Failed to open " << INPUT_FILENAME << std::endl;
exit(-1);
}
input_file >> size;
v.reserve(size);
for(i = 0; i < size; i++) {
input_file >> x;
v.push_back(x);
}
input_file.close();
// Call nule() function
nule(v);
// Print vector to output file
output_file.open(OUTPUT_FILENAME);
if(!output_file.good()) {
std::cout << "Failed to open " << OUTPUT_FILENAME << std::endl;
exit(-1);
}
output_file << size << std::endl;
for(i = 0; i < size; i++)
output_file << v[i] << " ";
output_file << std::endl;
output_file.close();
return 0;
} 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 Optimize :
void nule(std::vector<int> &v)
{
int i, k = 0, size = v.size();
for(i = 0; i < size; i++)
if(v[i] != 0)
v[k++] = v[i];
for(i = k; i < size; i++)
v[i] = 0;
}
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 #3198 Optimize
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3198 Optimize 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!