33 / 61
May 2018

Nie wiem z czego to wynika, ale chwilowo możesz dodać wyświetlanie ‘0’ jeżeli wszystkie liczby były niedodatnie.
Z pozostałych kwestii masz temp++; zarówno w if jak i w else bez żadnych warunków więc w zasadzie… po co Ci to tam?
Zawsze:

if(warunek) {
    instrukcje;
    temp++;
} else {
    instrukcje;
    temp++;
}

możesz zamienić na:

if(warunek) {
    instrukcje;
} else {
    instrukcje;
}
temp++;

o ile nie da się wyjść z pętli inaczej.

Rzeczy tego typu

if (sumy[0] < 0)
    sumy[0] = 0;
if (sumy[temp - 1] < 0)
    sumy[temp - 1] = 0;

mogłeś robić już przy wczytywaniu

A później to już Twoja rola by dowiedzieć się czemu się 0 nie wyświetla lub jakoś je inaczej wyświetlić.

Ok, po dłuższym szukaniu mam test którego nie przechodzisz:

100
-1134
-684
-668
10697
1675
8745
10773
-10453
2371
9348
-6341
-6601
7495
-7494
-6797
-3498
9153
-9393
-3123
-8980
-5236
-2849
-6769
-6057
10439
-7197
6211
-5093
11853
-3117
-8056
8501
2369
1186
10440
256
-1827
-4867
9302
5827
5033
-5450
6704
-2324
9372
4362
8661
-3113
-6002
8383
-11248
4326
4852
-8704
-10169
786
5706
-10909
-705
-3142
9876
10015
8326
-5272
-3470
-2253
2927
11219
-4024
2874
-2252
-9130
5928
-6089
-10343
6052
8286
5516
-5143
6651
-4468
8556
8299
10324
-3467
-4459
-7147
6703
-11424
2133
8079
-6579
-10824
4907
492
-5840
-1836
-6115
2888
7750

Twoja odpowiedź: 62585
Moja odpowiedź: 85051

Oraz kolejny:

40
-238
-854
753
793
855
-77
53
-42
-523
-424
983
113
-544
812
-134
608
206
-544
-302
-510
-597
-650
12
-612
421
-750
918
-827
721
-821
-678
-90
528
-354
-819
-576
938
-686
-65
-668

Twoja odpowiedź: 2401
Moja odpowiedź: 3432

I już wiem gdzie masz błąd w swoim programie, ale sam go musisz znaleźć. Natomiast dowód, że prawidłową odpowiedzią jest 3432:
753 + 793 + 855 - 77 + 53 - 42 - 523 - 424 + 983 + 113 - 544 + 812 - 134 + 608 + 206 = 3432.

Niewyświetlanym zerem zaś nie musisz się przejmować, po prostu daj cout << sumy[0] << endl;

PS. Gdy już naprawisz odezwij się na PW, to Ci wyślę swój kod i spojrzysz jak można to było zrobić prościej.

1 month later

Dlaczego te liczby muszą być typu long jak to spokojnie mieści się w int???

nie mieści:

1 month later

https://ideone.com/GqYGXb11

“Przekroczono limit czasu” :frowning:
Domyślam się, że to przez to, że używam tablicy, ale nie potrafię sobie wyobrazić jak to ma działać bez tablicy. Pomoże ktoś?

programista bez wyobraźni - to się nie może dobrze skończyć :slight_smile:

więc wyobraź sobie działanie twojego programu dla skrajnego przypadku: 100000 miast na trasie i w każdym zysk 100000 - ile razy musi się wykonać pętla i ile to czasu zajmie

Doskonale to rozumiem, ale po prostu nie potrafię rozwiązać tego problemu :confused:
Spróbujesz mnie jakoś naprowadzić na dobrą ścieżkę?

nie, ale w wątku jest informacja jak to zrobić poprawnie
i jest jeszcze kilka innych wątków dla tego zadania, w nich chyba też jest coś ciekawego :slight_smile:

Problemem jest tutaj nie to czy użyjesz tablicy czy nie ale jak. Jeżeli wczytasz wszystko [do tablicy] i [tylko] jednorazowo ją “przejrzysz” zmieścisz się w limicie czasu. Ale jeżeli tylko do tego ma służyć tablica, to można sobie wyobraźić, że nie jest konieczna. Możemy od razu, jednorazowo, przeglądnąć wejście, bez zapisywania wszystkiego do tablicy…

Praktyka czyni mistrza, więc na początek popraktykuj na takim, twoim kawałku kodu - popraw go:

    cin>>t;
    for(int a=1; a<=t; a++)
    {
        cin>>tab[a-1];
        suma+=a;
    }

i objaśnij o co tu chodzi, w kontekście tego zadania!? :wink:

Chodzi o zmienną ‘suma’ ?
Trochę się pobawiłem w matematyka i obliczyłem, że wszystkich możliwych przypadków przy n-tej liczbie miast jest 1+2+…+n.

A jeśli chodzi o jednorazowe przejrzenie liczb to muszę się nad tym głębiej zastanowić jak to ma działać. Dzięki narbej za nakierowanie :slight_smile:

Tak, ale …
czyż w matematyce [informatyce] nie 1 + 2 + … + n == n * (n+1) / 2 :wink:

no i przyjżyj się dokładniej samej pętli:

for (int a = 1; a <= t; a++) <-- nie można inaczej, lepiej [chyba, że za bardzo skupiłeś się na zmiennej suma] ,
a potem tab[a] zamiast tab[a-1]j?

W C++ zamiast tablic można i używa się często vektora, więc można:

cin >> t;
vector <int> tab(t);
for (int i = 0; i < t; ++i)
   cin >> tab[i];

lub, też w C++ ale może dopiero w nowszych wersjiach kompilatora:

cin >> t;
vector <int> tab(t);
for (auto &i : tab)
   cin >> i;

Tyle, że rozpatrywanie wszystkich przypadków = TLE - przekroczenie limitu czasu.

Tutaj chciałem wpisywanie do tablicy oraz sumowanie dać w jednym forze, żeby kodu było mniej.
Dlatego taki a nie inny for.

Co do vectorów, to jeszcze tego nie poznałem, ale na pewno trochę o tym poczytam.

Sugerując się twoim poprzednim postem, napisałem nowy kod13. Wydaje mi się, że jest znacznie lepszy, co prawda jeszcze go nie doszlifowałem bo sędzia pokazuje błędną odpowiedź :confused: Ale chyba o tym pisałeś prawda?

EDIT:
dodałem

if(zysk<1)
    {
        cout<<"0"<<endl;
        return 0;
    }

Też mi się tak wydaje, ale nadal masz za dużo razy przeglądanie tablicy.

Musisz wymyśleć taki kod [algorytm] w którym naprawdę tylko raz przeglądasz tablicę od początku do końca. Jeżeli przy wczytywaniu szukasz najlepszego miasta, to traktuję taką sytuację jako pierwsze przeglądanie tablicy. Dlaczego? Bo gdy jest tylko wczytywanie do tablicy, swojego rodzaju bufora, [pojemnika], kompilator prawdopodobnie potrafi to “samodzielnie” zoptymalizować - przy ustawionych opcjach optymalizacji. Gdy przy okazji wczytywania jest coś robione dodatkowo, może być już trochę gorzej.
Przy oddzielnych przeglądaniach od najlepszego w dół , a potem w górę dochodzi, może niewielki, ale jednak koszt zorganizowania pętli, a przy okazji zaciemnia to czytelność kodu. Na początku zakładasz zysk = 0, więc może być on tylko lepszy lub pozostać dalej zerowy, przy poprawnie napisanym kodzie. Nie potrzebne jest więc dodatkowe sprawdzanie, a także [błędne?] zerowanie obliczonego już wcześniej zysku, [w kilku miejscach twojego kodu].

Dziękuję ci niezmiernie za pomoc, sędzia zaakceptował kod.

Poczułem mega ulgę, że w końcu się udało, siedziałem nad tym 5-6 godzin, i zrobiłem 4 albo 5 różnie działających programów, jeszcze raz bardzo Ci dziękuje za pomoc :slight_smile: :slight_smile:

Powinieneś niestety usunąć link do działającego kodu.

Teraz powinieneś też zauważyć, że tablica jednak nie jest w tym zadaniu niezbędna.

Kod usunięty, a co do tablicy to zorientowałem sie dosyć szybko, ale o dziwo sędzia pokazał czas bez tablicy 0,08 a z tablicą 0,07 :stuck_out_tongue:

Napisałem, tylko że nie jest niezbędna. A że czas się zmienił, to nic dziwnego, raz będzie tak innym razem tak, ale chyba nie chodzi Ci tylko i wyłącznie o czas i o AC? :grinning: :tongue:

Jeżeli jednak zależy Ci na czasie, to mozesz dodać linijkę ios::sync_with_stdio (0);
Jeżeli chcesz, mogę Ci wysłać “wygładzony” twój kod na priv.

Nie trzeba :stuck_out_tongue: jestem początkującym programistą, wystarczy mi zwykłe AC :slight_smile:

17 days later

zobacz wynik dla danych, gdzie będziesz miał 50000 miast, każde 100000 (oczywiście łatwiej 5 miast po 1000000000, dane niezgodne e specyfikacją wejścia, ale wynik ten sam)

rozumiem, że przekracza zakres long long inta ale w takim razie jak to obejść skoro na long double również testów nie przechodzi