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

Program wyliczający ilość samochodów, które się miną

Ostatnio zmodyfikowano 2016-09-16 11:57
Autor Wiadomość
krolik5a
Temat założony przez niniejszego użytkownika
Program wyliczający ilość samochodów, które się miną
» 2016-08-12 09:17:24
Cześć, mam pytanie, czy mógłby mi ktoś napisać co w tym programie jest nie tak, za każdym razem program zamiast wypisać jakąś liczbę ( z przykładu 5) wypisuje 0. Bardzo proszę o pomoc.:
C/C++
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int t[ n ];
    cin >> t[ n ];
    int wynik = 0;
    for( int a = 0; a < n - 1; a++ )
    {
        for( int b = 1; b < n; b++ )
        {
            if(( t[ a ] == 0 ) &&( t[ b ] == 1 ) )
                 wynik++;
           
        }
    }
    cout << wynik << endl;
}

Treść zadania jest taka:
Przemek obserwuje ruch samochodów na drodze. Droga jest dwukierunkowa i łączy wschodnią część miasta z zachodnią. Ponieważ Przemek stoi na wzgórzu, to widzi dokładane położenie wszystkich samochodów.

Zastanawia się teraz, ile par samochodów minie się między sobą. Dwa samochody miną się, jeśli jadą w przeciwnych kierunkach, gdy pierwszy z nich (patrząc od lewej) jedzie na wschód, a drugi na zachód. Zakładamy, że samochody nie zawracają, nie wyprzedzają oraz wszystkie jadą prosto przed siebie.

Wejście

W pierwszym wierszu wejścia znajduje się jedna liczba całkowita  (), oznaczająca liczbę wszystkich samochodów, które widzi Przemek.

W drugim wierszu wejścia znajduje się  liczb całkowitych  (), oznaczających kolejne samochody, podawane w kolejności od najbardziej położonych na zachód (samochód  jest położony bardziej na zachód niż samochód ). Liczba , oznacza kierunek jazdy -tego samochodu:  - samochód jedzie na wschód,  - samochód jedzie na zachód.

W testach wartych co najmniej  punktów zachodzi dodatkowy warunek .

Wyjście

Pierwszy i jedyny wiersz wyjścia powinien zawierać jedną liczbę całkowitą, równą liczbie par samochodów, które będą się mijały.

Przykład

Dla danych wejściowych:
5
0 1 0 1 1


poprawną odpowiedzią jest:
5

P-150762
carlosmay
» 2016-08-12 10:49:11
C/C++
int n;
cin >> n;
int t[ n ]; // to nie jest zgodne z C++
cin >> t[ n ]; // wyjście poza tablicę
Użyj std::vector jeśli tablica nią ma z góry określonego rozmiaru.
P-150765
mateczek
» 2016-08-13 04:03:58
@ carlosmay
C/C++
cin >> t[ n ]; // wyjście poza tablicę
Coś mi się wydaje, że pami tą komendą chciała wczytać całą tablice (wszystkie elementy ze strumienia):P

@krolik5a
Do wczytania elementów musisz użyć pętli!!!
C/C++
#include <iostream>
#include <vector>

using namespace std;
int main()
{
    int n;
    cin >> n;
    vector < int > tablicaAut( n );
    for( int & kierunek: tablicaAut ) {
        cin >> kierunek;
    }
    int licznikMijania = 0;
    // algorytm z grubsza poprawny był tylko druga pętla miała zły warunek startowy
    for( int i = 0; i < tablicaAut.size() - 1; i++ ) {
        if( tablicaAut[ i ] == 1 ) continue; // jeśli porusza się auto w kierunku wstecznym nie ma sensu się nim zajmować przeskakujemy do następnej iteracji
       
        for( int j = i + 1; j < tablicaAut.size(); j++ ) { // tutaj było źle !!! nie startujesz od jedynki ale od następnego elementu!!!
            if( tablicaAut[ j ] == 1 ) licznikMijania++; // sprawdzamy z iloma się minie !!!
           
        }
    }
    cout << licznikMijania << endl;
}
P-150785
krolik5a
Temat założony przez niniejszego użytkownika
» 2016-09-14 11:57:19
Dziękuję bardzo za pomoc. A jakbym zrobiła to takim sposobem?:

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

int main()
{
    int n, kierunek;
    cin >> n;
    int wynik = 0, wschod = 0;
    for( int k = 1; k <= n; k++ )
    {
        cin >> kierunek;
        if( kierunek == 0 )
             wschod = wschod + 1;
        else
             wynik = wynik + wschod;
       
    }
    cout << wynik << endl;
}

Wynik wychodzi mi poprawny, ale na sprawdzarce nie przechodzi. Co jest w nim źle?
P-151720
mateczek
» 2016-09-16 00:37:39
a kod wyżej ci przechodzi?? dla mnie wygląda w porządku
zmień licznik mijań na long long
long long wynik = 0, wschod = 0;
P-151748
krolik5a
Temat założony przez niniejszego użytkownika
» 2016-09-16 01:55:06
No właśnie, ten który wysłałeś nie przechodzi. Jak zmieniłam na long long to jest już dobrze. Mam tylko prośbę, mógłbyś mi napisać dlaczego tam ma być long long a nie int, bo nie wiem? :)
P-151749
michal11
» 2016-09-16 10:07:11
» Kurs C++ » Poziom 1Pojęcie zmiennej i podstawowe typy danych lekcja

Jeżeli może być maksymalnie 10^6 samochodów to w najgorszym przypadku liczba par będzie znacznie większa niż maksymalny zakres inta.
Przetestuj taki program dla miennej wynik typu int i long long:
C/C++
#include <iostream>
using namespace std;

int main()
{
    int n = 1000000, kierunek;
    long long wynik = 0, wschod = 0;
   
    for( int k = 1; k <= n; k++ )
    {
        if( k < n / 2 ) { kierunek = 0; }
        else { kierunek = 1; }
       
        if( kierunek == 0 )
             wschod = wschod + 1;
        else
             wynik = wynik + wschod;
       
    }
    cout << wynik << endl;
}
P-151750
mateczek
» 2016-09-16 11:45:43
Az sobie założyłem konto by zobaczyć co się dzieje. :P
Program z góry nie przechodził bo serwis nie wspiera c++11 i chyba kontenerów też nie za bardzo(błąd kompilacji) nie wnikałem głęboko
Przy próbie kompilacji twojej drugiej wersji wyskoczyło, że oczekiwany wynik 232143253465456 a otrzymany -1423523
Liczba ujemna wskazuje na wyjście poza zakres liczby int. trzeba zwiększyć typ lub spróbować z unsigned int
P-151751
« 1 » 2
  Strona 1 z 2 Następna strona