“Przekroczono limit czasu”
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ś?
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!?
Tak, ale …
czyż w matematyce [informatyce] nie 1 + 2 + … + n == n * (n+1) / 2
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ź 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].
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?
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.
Myślę, że właśnie udało Ci się znaleźć na czym polega trudność tego zadania
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