Pierwszy i ostatni - zadanie - proszę o pomoc :)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Pierwszy i ostatni - zadanie - proszę o pomoc :)

AutorWiadomość
Temat założony przez niniejszego użytkownika
Pierwszy i ostatni - zadanie - proszę o pomoc :)
» 2016-08-04 12:13:53
Cześć. Czy mógłby mi ktoś pomóc? Bardzo proszę. Mianowicie mam takie zadanie:

Dany jest ciąg liczb całkowitych dodatnich określający ceny akcji danej spółki na giełdzie w kolejnych dniach (na koniec każdego dnia). Chcemy stwierdzić, czy któregoś dnia cena akcji wynosiła dokładnie x. Jeśli był więcej niż jeden taki dzień, Twój program powinien wyznaczyć pierwszy i ostatni taki dzień.

Wejście
Pierwszy wiersz wejścia zawiera dwie liczby całkowite n oraz x (1 ≤ n ≤ 100000, 1 ≤ x ≤ 109), oddzielone spacją i oznaczające liczbę kolejnych dni, przez które notowano ceny akcji danej spółki, oraz interesującą nas cenę akcji. Drugi wiersz zawiera n liczb całkowitych z zakresu od 1 do 109, oddzielonych spacjami, oznaczających ceny akcji spółki w kolejnych dniach.

Wyjście
Twój program powinien wypisać dwie liczby oddzielone spacją. Pierwszą z nich powinien być numer pierwszego dnia (będący liczbą między 1 a n), którego cena akcji wynosiła dokładnie x. Drugą natomiast powinien być numer ostatniego takiego dnia. Jeśli był tylko jeden dzień, gdy cena akcji wynosiła x, obie liczby na wyjściu powinny być takie same. Jeśli cena x w ogóle nie wystąpiła, obie liczby powinny być równe −1.

Dla danych wejściowych:
7 3
1 3 5 2 3 4 3
poprawnym wynikiem jest:
2 7

To co udało mi się napisać:

C/C++
#include <iostream>
using namespace std;

int main() {
    int n, x;
    cin >> n >> x;
    int t[ n ];
    for( int i = 1; i <= n; i++ )
         cin >> t[ i ];
   
    for( int i = 1; i <= n; i++ )
    if( t[ i ] == x )
         cout << i << " ";
   
    cout << endl;
   
}

Program wpisuje wszystkie dni, w których jest x. Nie wiem jak zrobić, aby program wypisał tylko pierwszy i ostatni dzień.
P-150557
» 2016-08-04 12:32:16
Bez sensu jest zapisywanie tych wszystkich liczb do tablicy, a w taki sposób jak ty zrobiłaś to już w ogóle.

prosty algorytm (łatwiej chyba będzie pokazać kod niż próbować wytłumaczyć jego działanie):
C/C++
int x, n;
int first = - 1, last = - 1;
int value;

cin >> n >> x;

for( int i = 1; i <= n; ++i )
{
    cin >> value;
   
    if( value == x )
    {
        if( first == - 1 ) { first = i; }
        else { last = i; }
    }
}

if( last == - 1 ) { last = first; }

cout << first << " " << last;
P-150558
Temat założony przez niniejszego użytkownika
» 2016-08-04 12:40:50
Aha, no może i racja, że bez sensu. A dlaczego jest błąd komplikacji w Twoim programie, bo zbytnio nwm (dopiero zaczynam pzygodę z programowaniem)
P-150560
» 2016-08-04 12:53:43
Jaki błąd ?

Może tylko dodam, że to nie jest program tylko (tak jak napisałem) sam algorytm.
P-150561
» 2016-08-04 13:03:42
Trochę prostsza wersja. ;)

C/C++
int x, n;
int first = - 1, last = - 1;
int value;

cin >> n >> x;

for( int i = 1; i <= n; ++i )
{
    cin >> value;
   
    if( value == x )
    {
        if( first == - 1 ) { first = i; }
        last = i;
    }
}

cout << first << " " << last;
P-150562
Temat założony przez niniejszego użytkownika
» 2016-08-04 13:09:00
A dlaczego z first i last przyjęliście od razu wartość -1? Założyliście, że x w pierwszym i ostatnim nie wystepuje?
P-150564
» 2016-08-04 14:27:53
First i last po prostu zachowają wartość -1 jeśli nie zostaną znalezione żadne wystąpienia x. Dzięki temu program wyświetli -1 w odpowiedniej sytuacji.

//edit po prostu przeanalizuj dokładnie zachowanie programu, first i last to kolejno pierwsze i ostatnie wystąpienia x.
P-150572
« 1 »
 Strona 1 z 1