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

Buna!
Ma poate ajuta cineva cu problema aceasta?

#2837 Intervale5



Enunț
Soluții
Cerința
Se dă un șir de cel mult un milion de numere naturale din intervalul [0,102]. Se cere să se determine toate perechile distincte formate din termeni ai șirului dat, x și y (y-x≥2), astfel încât să nu existe niciun termen al șirului care să aparțină intervalului (x,y). Dacă nu există nicio astfel de pereche, se afișează mesajul nu exista.

Date de intrare
Fișierul de intrare intervale5.in conține pe prima linie elementele șirului, separate prin spații.

Date de ieșire
Fișierul de ieșire intervale5.out va conține perechile găsite, câte una pe linie, în ordine strict crescătoare, separate printr-un spațiu, iar dacă nu există nicio astfel de pereche, se afișează mesajul nu exista.

Restricții și precizări
pentru determinarea numerelor cerute utilizați un algoritm eficient din punctul de vedere al timpului de executare: recomandă evitarea memorării elementelor șirului într-un tablou sau în altă structură de date similară;

Exemplu
intervale5.in

5 9 0 8 10 11 12 13 15 14 6 7 40 10 0 0 5 41 95 7
intervale5.out

0 5
15 40
41 95
Multumesc!

Răspunsuri la întrebare

Răspuns de boiustef
8

Răspuns:

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("intervale5.in");

ofstream g("intervale5.out");

int v[102], i, x, y, gasit, num;

int main()

{

   while (f >> num)

       ++v[num];

   i=0; while (v[i]==0) ++i;

   while (i<99)

   {

      while (v[i]!=0 && i<99) ++i;

      if (i<100)

      {

          x=i-1;

          while (v[i]==0 && i<101) ++i;

          if (i<101)

          {

              y=i;

              if (y-x>=2)

              {g << x << " " << y << "\n";

              gasit=1;}

          }

      }

   }

   if (gasit==0) g << "nu exista";

}

Explicație:

dacă ai neclarităţi, întreabă, dar mai întîi stăruete să înţelegi logica


boiustef: toate numerele din fişier se spune că sunt din intervalul [0,100], deaceea vectorul de frecvenţă e de această dimensiune
boiustef: Fie un început al vectorului de frecvenţă arată astfel:
0 0 4 1 0 0 0 3 2 1 0 0 0 0 4 .....
asta înseamnă că ân fişier nu s-a găsit 0 şi nici 1, iar 2 este de 4 ori, 3 este de 1 ori, numerele 4, 5, 6 lipsesc, iar 7 de 3 ori, sunt 2 de 8, un 9, nu este 10, 11, 12 13 şi sunt 4 de 14 şamd
boiustef: Se cere să se determine toate perechile distincte formate din termeni ai șirului dat, x și y (y-x≥2), astfel încât să nu existe niciun termen al șirului care să aparțină intervalului (x,y). Pentru exemplul de sus avem două intervale: (3,7) şi (9,14) unde nu se conţin termeni ai şirului. Adică intervalele unde sunt zerouri
boiustef: cu acest while (v[i]==0 && i<101) ++i; se trece prin zerouri până se ajunge la un număr diferit de zero, acela va fi y
sikesjack1: am inteles acuma. deci practic caut elementele pt care vectorul de frecventa este nul, nu elementele in sine.
boiustef: da, căutăm acele găuri în vector cu elemente nule, dar x şi y sunt totuşi elemente din şir, dar între ele sunt numai zerouri
boiustef: toate perechile distincte formate din termeni ai șirului dat.... din termeni ai şirului... deci x şi y sunt termeni ai şirului
boiustef: intervale cu zerouri, dar capetele lui sunt elemente din şir
boiustef: nb...
sikesjack1: am inteles, multumesc!
Alte întrebări interesante