Najduža serija

Funkcija analiziraj() učitava n celih brojeva u dinamički alociran niz. Prekida se pri unosu negativne vrednosti, u suprotnom ispisuje najdužu seriju jednakih susednih elemenata.

Zadaci:

  1. Pokrenuti testove pod ASan-om. Dva testa padaju iako je ispis tačan. Objasniti zašto.
  2. Ispraviti greške pomoću std::make_unique<int[]>(n) iz <memory>. Pored toga, ključna reč delete ne sme da se pojavi u konačnom rešenju.

Ulaz

U prvom redu učitava se broj elemenata n $(n \ge 1)$. U drugom redu učitava se n elemenata niza.

Izlaz

Ako je neki broj negativan, ispisati negativna vrednost na poziciji <p>, gde je p pozicija prve negativne vrednosti. Pozicije se računaju od 1.

U suprotnom ispisati najduži blok jednakih susednih vrednosti L.

Primer

Ulaz

8
3 3 1 1 1 2 2 3

Izlaz

3

Primer

Ulaz

4
5 -2 5 5

Izlaz

negativna vrednost na poziciji 2

Postavka

main.cpp

// Polazna (sirova) verzija - cilj je da se prepravi pomocu std::unique_ptr.
//
// 1. Pokrenuti testove pod ASan-om. Dva testa padaju iako je ispis tacan.
//    Objasniti zasto (koji new[] nema odgovarajuci delete[]).
// 2. Prepraviti koristeci std::make_unique<int[]>(n) iz <memory>. Kada se
//    zavrsi, rec "delete" ne sme da se pojavi u konačnom rešenju.

#include <iostream>

namespace matf
{
  void analiziraj()
  {
    int n;
    std::cin >> n;

    int* a = new int[n];

    for (int i = 0; i < n; ++i) {
      std::cin >> a[i];
      if (a[i] < 0) {
        std::cout << "negativna vrednost na poziciji " << i + 1 << std::endl;
        return;                                          // TODO: curi blok a
      }
    }

    int najbolja = 1;
    int trenutna = 1;
    for (int i = 1; i < n; ++i) {
      if (a[i] == a[i - 1])
        ++trenutna;
      else
        trenutna = 1;
      if (trenutna > najbolja)
        najbolja = trenutna;
    }
    std::cout << najbolja << std::endl;

    delete[] a;
  }

} // namespace matf

int main()
{
  matf::analiziraj();
  return 0;
}

Rešenje

main.cpp

#include <iostream>
#include <memory>

namespace matf
{
  void analiziraj()
  {
    int n;
    std::cin >> n;

    std::unique_ptr<int[]> a = std::make_unique<int[]>(n);

    for (int i = 0; i < n; ++i) {
      std::cin >> a[i];
      if (a[i] < 0) {
        std::cout << "negativna vrednost na poziciji " << i + 1 << std::endl;
        return;                                          // a oslobadja blok ovde
      }
    }

    int najbolja = 1;
    int trenutna = 1;
    for (int i = 1; i < n; ++i) {
      if (a[i] == a[i - 1])
        ++trenutna;
      else
        trenutna = 1;
      if (trenutna > najbolja)
        najbolja = trenutna;
    }
    std::cout << najbolja << std::endl;
  }                                                        // ... i ovde

} // namespace matf

int main()
{
  matf::analiziraj();
  return 0;
}