Rezolvare PBinfo #3198

Decorative Icon Problema: Optimize / 3198

Decorative IconAutor: Deivid

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;
}

Decorative Icon Explică rezolvarea folosind Inteligența Artificială

Folosește modelul nostru de AI special antrenament pentru a rezolva problemele de pe PBinfo! În baza creditelor AI primești explicații pentru probleme, pe care le alegi și le rulezi exact atunci când dorești, la un singur click distanță! Află mai multe informații:

👉 Achiziționează credite AI
Andrei Frîntu
Andrei Frîntu

Fondatorul platformei - mentor Academia

LinkedIn Instagram GitHub
© Copyright 2024 - CodulLuiAndrei.ro - Toate drepturile sunt rezervate