Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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

Ostatnio zmodyfikowano 2016-08-04 14:27
Autor Wiadomość
krolik5a
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
michal11
» 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
krolik5a
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
michal11
» 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
Gibas11
» 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
krolik5a
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
Gibas11
» 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