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

#2818 Inserare2

Cerința
Numim inserare a unui șir A într-un șir B introducerea, între două elemente ale șirului B, a tuturor elementelor lui A, pe poziții consecutive, în ordinea în care apar în A.

Se dau două șiruri cu n, respectiv m elemente numere întregi ordonate strict crescător, în care numerotarea elementelor începe de la 1.

Se cere să se afișeze poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.

Date de intrare
Fișierul de intrare inserare2.in conține numere naturale din intervalul [1,106]: pe prima linie numerele m și n, iar pe fiecare dintre următoarele două linii câte un șir de m, respectiv de n numere întregi ordonate strict crescător. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.

Date de ieșire
Fișierul de ieșire inserare2.out va conține poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.

Restricții și precizări
Proiectați un algoritm eficient din punctul de vedere al spațiului de memorie utilizat și al timpului de executare.
se recomandă o soluție care să nu memoreze cel două șiruri în tablouri sau alte structuri de date similare.
Exemplul 1
inserare2.in

4 6
15 16 17 19
7 10 12 20 30 40
inserare2.out

4
Explicație
Se poate obține șirul 7, 10, 12, 15, 16, 17, 19, 20, 30, 40.

Exemplul 2
inserare2.in

4 6
15 16 17 19
7 14 18 20 30 40
inserare2.out

imposibil
Exemplul 3
inserare2.in

4 6
1 2 3 4
7 14 18 20 30 40
inserare2.out

imposibil


boiustef: cred e foarte eficient algoritmul... foloseşte numai 6 variabile

Răspunsuri la întrebare

Răspuns de boiustef
3

Răspuns:

Explicație:

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("inserare2.in");

ofstream g("inserare2.out");

int n, primulA, ultA, i, m, num1, num2;

int main()

{

   f >> n >> m;

   f >> primulA;

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

       f >> ultA;

   f >> num1;

   if (num1>=ultA || num1>=primulA)

       g << "imposibil";

   else

   {

       i=1;

       num2=num1;

       while (num2<primulA)

       {

           ++i;

           num1=num2;

           f >> num2;

       }

       if (num2<=ultA) g << "imposibil";

       else g << i;

   }

}

Alte întrebări interesante