35 / 61
May 2018

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

Myślę, że właśnie udało Ci się znaleźć na czym polega trudność tego zadania :smiley:

PS1
A od kiedy long double można używać kiedy long long int nie działa? Toż to chyba jakiś zelentyzm

PS2
Twój algorytm przechodzi np po zastosowaniu BigIntów (przynajmniej tych mojego autorstwa). Pytanie, czy potrzebujesz takiej klasy, zostawiam otwarte :slight_smile:

Właśnie dostałem accept, dzięki za pomoc.
btw poprzedni pomysł z long double też by przeszedł tylko skrócony wynik gryzł się z oczekiwanym przez sprawdzarkę wystarczyło ustawić precyzję.