Stefan, co robię źlę?
Ja nie Stefan, a chociażby, co oznacza, każdy, powinien wiedzieć. W kodzie jest dużo więcej złych rzeczy.
Chociażby niepotrzebne i nieumiejętne używanie zmiennych globalnych, chociaż, akurat to nie ma wpływu na sędziego, tylko na pewnego bad guy’a Jak czysto pisać w C++
dziękuje za rady co do kodu, ale to chyba nie jego estetyka wpływa na brak AC, najlepiej prosiłbym o podanie jakiegoś testu, którego program nie wykonuje, sam takiego nie umiem znaleźć niestety
zmieniłem warunki w tym miejscu
for (int x=0; x<temp-2 && temp!=1; x+=2){
if(sumy[x]+sumy[x+1]+sumy[x+2]>=max(sumy[x], sumy[x+2])) {
@pawkot mylisz się, to estetyka najczęściej na to wpływa. To przez wygląd kodu, brak poprawnie nazwanych zmiennych, niestosowanie wcięć itp. nie możesz znaleźć gdzie jest błąd. Najważniejsze byś pisał kod tak czytelnie, że gdy wrócisz do niego po pięciu latach to po chwili będziesz wiedział co i jak robi.
#include<iostream>
using namespace std;
int main()
{
const int myconst = 10;
double p[myconst];
float temp;
int as;
for(as = 0; as < myconst; ++as)
{
cout << "Wpisz cene: ";
cin >> temp;
if (temp==int(3>3)){
} else
{
p[as]=temp
}
}
cout << endl <<
"Ceny w odwrotnej kolejnosci" << endl;
for (as = myconst; as > 0; --as)
cout << p[as] << " ";
cout << endl;
return 0;
}
Znajdź błąd w powyższym kodzie. Przesadzony przykład, ale idea jest taka: chcesz pisać kod zawierający mniej błędów? Pisz jak najbardziej czytelnie się da. Na drugim miejscu postaw poprawne działanie. Zwróci Ci się koszt tej inwestycji gdy będziesz miał coś poprawić.
Co do kodu… nie wiem o co w nim chodzi, jaka idea przyświecała, nic z niego nie pojmuję, ale przede wszystkim działa źle dla danych z zadania to możesz sprawić aby przeszło ten pierwszy test:
W pracy jeszcze nie dostałem ochrzanu za to, że mój kod nie działa lub działa źle, bo wtedy podchodzi ktoś mądrzejszy ode mnie i po chwili patrzenia w ładnie napisany kod mówi mi “o tu zapomniałeś dodać tych dwóch zmiennych”, a ja mówię “o kurcze faktycznie, dzięki”. Były jednak sytuacje, że mój kod działał niemal perfekcyjnie, ale było tam tak narzygane pod względem wyglądu tego kodu, że ani nikt mi nie chciał pomóc, ani ja sam nie doszedłem o co tam chodzi chociaż pisałem to wczoraj i musiałem przepisywać od początku. Najgorsza tragedia mnie spotyka jak napisałem coś niechlujnie i zadziałało tak jak powinno. Rok później trzeba zmienić działanie, dostosować do nowych wymagań, a ja tydzień płaczę nad własnym kodem dlaczego napisałem to tak jakbym był naćpany i nie potrafię nic zmodyfikować.
faktycznie chyba troche sobie nie zdawałem sprawy z istotności estetyki (jestem dosyc początkująćy i takie rzeczy wydawały mi sie raczej błahe), ale przekonałeś mnie, będe przykładał do tego większą wage
co do kodu trochę go naprawiłem i spróbowałem go chociaż troche "uprzyjaźnić"
tak się prezentuje na chwile obecną, teraz przechodzi wszystkie testy zarówno z zadania jak i z komentarzy
https://ideone.com/ArhJdg12
Lepiej z kodem, chociaż jeszcze daleko mu do doskonałości - postaraj się nie nazywać zmiennych a
, n
, x
- chyba, że w pętli for
, tam jest wybaczalne.
Co do testu, którego nie przechodzisz to śmiem twierdzić, że nie przechodzisz jednego testu z zadania:
link5,
a jakbyś się chciał dalej zainteresować dobrze napisanym kodem, to:
clean code5
właśnie nie rozumiem za bardzo z czego to wynika, bo w kompilatorze na komputerze normalnie pokazuje 0, tak samo jak sie wejdzie w edycje na ideone i da te same dane
https://i.imgur.com/NyDX6lD.png7
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.
“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].