7 / 17
Oct 2017

Cześć wszystkim. Sprawdziłem zestawy przykładowe podane w zadaniu, program dla nich działa. Działa także dla zestawów, które ktoś podsunął w komentarzach, więc naprawdę nie wiem, dlaczego dla sędziego nie działa :frowning:

Czy ktoś może mi podpowiedzieć, co robię źle? Jestem dopiero na początku nauki programowania; właściwie przerobiłem dopiero 2/3 kursu Mirosława Zelenta na yt :slight_smile:

#include

using namespace std;

int m, liczba_miast, zysk, zyskm, mi, maks_suma_lewa, maks_suma_prawa, suma_czastkowa_prawa, suma_czastkowa_lewa;

int main()
{
cin>>liczba_miast;

int *zysk_strata;
zysk_strata = new int [liczba_miast];

for (int i=0; i<liczba_miast; i++)
{
    cin>>zysk_strata[i];
}

m=zysk_strata[0];
for (int i=0; i<liczba_miast; i++)
{
    if (zysk_strata[i]>m)
    {
        m=zysk_strata[i];
    }
}

for (int i=0; i<liczba_miast; i++)
{
    if (m==zysk_strata[i])
    {
        mi=i;
        maks_suma_lewa=m;
        suma_czastkowa_lewa=m;

        for (int i=mi; i>0; i--)
        {
            suma_czastkowa_lewa=suma_czastkowa_lewa+zysk_strata[i-1];
            if (suma_czastkowa_lewa>=maks_suma_lewa)
            {
                maks_suma_lewa=suma_czastkowa_lewa;
            }
        }

        maks_suma_prawa=m;
        suma_czastkowa_prawa=m;
        for (int i=mi; i<liczba_miast-1; i++)
        {
            suma_czastkowa_prawa=suma_czastkowa_prawa+zysk_strata[i+1];
            if (suma_czastkowa_prawa>=maks_suma_prawa)
            {
                maks_suma_prawa=suma_czastkowa_prawa;
            }
        }

    zysk=maks_suma_lewa+maks_suma_prawa-m;
    zyskm=zysk;
    if (zysk>zyskm)
    {
        zyskm=zysk;
    }
    }
}
if (zyskm<=0)
{
    zyskm=0;
}
cout<<zyskm;

return 0;

}

  • created

    Oct '17
  • last reply

    Feb '18
  • 16

    replies

  • 1.7k

    views

  • 4

    users

  • 3

    likes

  • 5

    links

  1. program przekazujemy jako link do ideone.com6

  2. nie zakładamy nowego wątku, jeżeli już jest wątek poświęcony temu zadaniu

  3. jeżeli jest wątek (a dla tego zadania jest dużo wątków - dzięki takim jak ty), to czytamy

  4. sprawdź działanie twojego programu dla danych:

    10
    2 2 2 2 2 2 2 -20 6 -10

To i tak o całe 2/3 dużo za dużo.
Czy to takie trudne, znaleźć jakąś [dobrą] książkę do nauki podstaw? Na pewno każda będzie dużo lepsza niż ten kurs, ale oczywiście to twój wybór.

Jesteście pomocni, ale uwaga w nawiasie w punkcie trzecim jest tyleż nieuprzejma, co niepotrzebna i moglibyście ją sobie odpuścić.

Sprawdziłem i dopracowałem program, teraz już poprawnie rozpoznaje tego typu przypadki, wciąż jednak sędzia go nie przepuszcza, zatem problem musi być bardziej skomplikowany. Mam już nowy pomysł, dzisiaj już nie napiszę programu, ale w ciągu najbliższych dni postaram się go przelać na codeblocksa.

Aha. Bo ktoś początkujący wie, że kurs jest słaby i że lepiej znaleźć dobrą książkę. Wiesz, co wyskakuje w googlach, kiedy pytasz o książkę do C++? Opinie, żeby robić kurs Mirosława Zelenta + że książki są fajne, ale na każdą jest tyleż głosów na tak, co na nie.

Nie wydaje Ci się, że gdyby nie było to takie trudne, czyt. gdyby było to oczywiste, żeby nie robić kursu, nie miałby 600k+ wyświetleń?

Teraz już wiesz?
Nie oceniam jakości kursu po ilości wyświetleń, tylko osobiście oglądnąłem go, a więc nie 600k+, tylko 600k -1*k [minus moje kilkukrotne oglądnięcie go]. Książki to coś co ogląda się, wertuje i decyduje samodzielnie o zakupie lub nie, w księgarniach a nie patrzy co wyskakuje w googlach. Chyba, że wierzysz, że w googlach znajdziesz tylko same poprawne, jednoznaczne odpowiedzi. Książka ma być dobra dla Ciebie, a nie dla mnie czy kogoś innego, więc po co ci opinie innych. Jeżeli uważasz, że kurs jest dobry dla Ciebie i jeszcze do tego ma 600k+ wyświetleń, to po prostu, może zrób go, zamiast bawić się w adwokata?

Przyzwyczajaj się. W IT jest dużo atrakcji, ale jeśli ktoś chce pracować w IT to musi mieć odpowiednią mentalność: nie wymagać uprzejmości, przygotować się na ostrą krytykę kodu i podejścia do różnych problemów, pracować i myśleć.

Oczywiście nikt nie każe Ci pracować w IT, ale jeżeli chcesz umieć rozwiązywać zadania algorytmiczne (także poza SPOJem) to i tak jesteś skazany na przedstawicieli tej branży. Możesz też prosić o pomoc matematyków, informatyków (informatyka <> IT) czasami nawet fizyków, za to biologów i chemików na ogół nie. Jednak po nich również nie spodziewaj się kurtuazji :wink:

Pytanie czy zasłużyłeś na jakąkolwiek krytykę i nieuprzejmość? Oceń to samemu, dla mnie sytuacja wygląda jak poniżej.

Ok, jesteś początkujący, ale czy nie można było poczytać na forum jak wkleja się kod? Bo Twoje wklejenie jest niepoprawne, co chyba jest jasne. Rozumiem, że można zapomnieć się po n-tym poście, zmianach technicznych itd, ale przy pierwszym wpisie chyba warto dobrze wypaść? :wink:

jw

jw

I tego już nikt się nie czepia - jako osoba początkująca nie musisz umieć testować kodu dla aż 10 liczb. Jeżeli działa dla przykładowego wejścia to już spory sukces. Oczywiście są pewne granice, ale tak czy siak testowanie jest nietrywialnym problemem.

Niekoniecznie książkę - są różne źródła wiedzy. W każdym razie ja podejrzewałem, że kurs jest słaby po 2/3 kursu podstawowego, a wątpliwości nie miałem po C++ Builderze. Nota bene też zaczynałem od Zelenta. I co bardziej istotne:

Odkąd Zelent zaczął kompromitować się obiektówką i pseudofilozofią zacząłem natrafiać na opinie zupełnie przeciwne. http://platyna.org/blog/2014/01/04/ciag-fibonacciego-i-zlota-proporcja-w-naturze/8 (raz), opinie i uwagi chociażby na tym forum (dwa, trzy, … kilkanaście / kilkadziesiąt wpisów), krytyczne uwagi w komentarzach o np. tragicznie słabym opisie struktur danych (kilkanaście / kilkadziesiąt + ileś), krytyka na jego własnym forum (https://forum.pasja-informatyki.pl/122259/co-jest-nie-tak-z-najnowszym-odcinkiem-kursu-miroslawa-zelenta5), gdzie autor jak zawsze odpowiada, że stosuje uproszczenia dydaktyczne i kiedyś przejdzie do konkretów, a jak to się kończy wiemy z zaniechanego około 3 lata temu kursu C++ (kilkanaście / kilkadziesiąt + ileś + 1), …

3 months later

Witam.
Trochę inne pytanie, bo co prawda wyskakuje mi “przekroczono limit czasu” (w sumie i tak nie wiem dlaczego), ale ja nie o tym. Ogólnie to mój program daje dobre wyniki. Problem w tym, że nie wiem dlaczego on działa. :smiley: Jeśli tak w głowie prześledzę co się tam dzieje, to wydaje mi się, że program nie powinien znajdować dobrego wyniku. Nie wiem, czy dobrze myślę (i czy w ogóle dobrze to o mnie świadczy, że nie wiem co napisałem xD), ale w pierwszej iteracji tej zewnętrznej pętli, są sumowane wszystkie podane liczby, potem wszystkie oprócz pierwszej, dwóch pierwszych itd. I tu moje pytanie - jeśli liczby, które dam na sam początek dadzą największy zysk, to dlaczego program daje dobry wynik, jeśli w żadnej iteracji nie sumuje tylko ich obu?
Pewnie przesadzam i głupie pytanie, ale to już kolejny program, który napisałem i on działa, a ja nie wiem dlaczego :smiley:

#include <iostream>

using namespace std;

//stefan

int main()
{
    int l_miast, zysk = 0, maks = 0;

    cin >> l_miast;

    int * zyski;
    zyski = new int [ l_miast ];

    for( int i = 0; i < l_miast; i++ )
        cin >> zyski[ i ];

    for( int i = 0; i < l_miast; i++ )
    {
        for( int j = i; j < l_miast; j++ )
        {
            zysk += zyski[ j ];
            if( zysk > maks )
                maks = zysk;
        }
        zysk = 0;
    }

    cout << maks;

    delete [] zyski;
    return 0;
}

Jeśli nie dostanę za tak głupi temat bana, to z góry dzięki :smiley:

Daj jakieś cout’y informujące o tym, o czym jest program.

Bo Twój program jest za wolny.

Koledze zapewne chodziło o jakiś konkret, np. przykład, dla którego wynik powinien wyjść bee a wychodzi ok (albo odwrotnie) bo przy kodzie nieprawidłowo wklejonym i dodatkowo nieprawidłowo założonym temacie trzeba jeszcze analizować kod, którego nie rozumie… jego autor.

A co robisz w n pierwszych iteracjach pętli wewnętrznej dla i = 0? Podpowiedź poniżej:

        zysk += zyski[ j ];
        if( zysk > maks )
          maks = zysk;

Wynik akurat zawsze jest dobry (a przynajmniej nie znalazłem danych, żeby wyszedł źle).

Zauważyłem, że jest dziwnie wklejone, ale nie umiem tego naprawić. Wklejam kod w cytat i z jakiegoś powodu początek wyskakuje poza cytat. Jeśli coś nie tak z tematem, to przepraszam, wzorowałem się na innych i nie czytałem regulaminu, postaram się wszystko naprawić.
Wiem, trudne zadanie dla was, przepraszam, głupia sytuacja w ogóle.

No sumuję wszystko i to jest mój maks. Ale niekoniecznie wtedy wyjdzie największy wynik. I najprawdopodobniej to nie będzie maksimum.

Ogólnie to mój zamysł z początku był taki, żeby sprawdzać każde możliwe sumy (czyli możliwości byłoby 1+2+…+l_miast), ale wyszło kompletnie co innego (kiedy zauważyłem, że ta wersja programu działa to zmieniłem pętle, bo inaczej wyglądała, z resztą nieistotne), a to bez sprawdzania każdej możliwej sumy nadal daje dobry wynik, nie wiem skąd się on bierze. Bo jeśli np. maksimum to będą powiedzmy 2 pierwsze podane liczby, to w którym momencie program to obliczy? Kiedy kiedykolwiek program sumuje TYLKO te dwie liczby ze sobą?

Chodziło mi o wyjaśnienie swojego problemu na jakimś konkretnym przykładzie, a nie w sposób abstrakcyjny :wink:

Też miałem z tym problemy. Nowe forum jak na mnie zniechęca do wklejania kodów. Może to i dobrze, że kody zżerają mniej pamięci?

Wklejaj swoje kody jako linki do ideone.

Dlaczego?

Wracamy do mojej podpowiedzi :wink: Możesz pomocniczo coutować sobie w kodzie bieżące wartości maks, zyski[j] oraz zysk. Wracamy też do mojego pytania:

Pytanie dla i = 0 i n = 2 :wink:

Ponieważ wprowadzane wartości mogą być ujemne.

Powypisywałem sobie wszystko, i muszę przyznać, że nieźle mi to wyszło. :smiley: Nie zauważyłem, że if(zysk > maks) jest sprawdzany co każdą iterację (jestem idiotą).
Przypadkowo rozwiązałem zadaniem, super! Czyli czasem opłaca się napisać coś bezmyślnie i trzymać kciuki, że będzie działało. :smiley:
Muszę częściej sobie wypisywać zmienne w taki sposób, gdy napotkam problem. Taki debugger z getta :smiley:
Ogólnie to dzięki za pomoc, że poświęciłeś czas dla tak niekompetentnej osoby jak ja :smiley:
Temat do zamknięcia (a tego się nauczyłem z innych forów, nie wiem jak tutaj jest xD)

Nie bądź wobec siebie taki surowy. Ilu takich rzeczy ja nie widziałem. I wszyscy tu obecni.

Czasem :wink: Choć swoją drogą: myślałem, że jednak nie mieścisz się w limicie czasowym :wink:

Bardzo dobra technika ze zbioru technik podstawowych i łatwych do opanowania.

Do usług :wink:

Tutaj nie zamykamy tematów i preferujemy by każdy dopisywał się do już istniejących.

W limicie czasowym nie mieszczę się nadal. Nie wiem, czy da się ten program przyspieszyć, ale jak już wiem o co w nim chodzi, to będę myślał :smiley: