- Zaznacza się cały kod i dopiero klika w
</>
lub wkleja kod na ideone.com, a tu link do wykonanego tam testu. - SPOJ raczej nie służy do nauki [programowania] a do, swoją drogą w bardzo atrakcyjnej formie, testowania i utrwalania swoich umiejętności i porównywania z umiejętnościami innych [już coś kolwiek umiejących] programistów. Do tego [nauki] jest literatura i nauczyciele, a wybacz ja nie jestem.
- bonus [number 2]: ---> http://213.192.104.217/phpBB3-spoj-pl-backup/viewtopic.php?f=1&t=1214&sid=473a6ed0abb4ff296004debda0fd65457 , ze szczególnym uwzględnieniem pkt 10
- warto też poczytać posty w tym wątku + posty w innych wątkach dotyczących tego zadania: http://discuss.spoj.com/search?q=ob%C5%BCartuchy
- Podstawą jest treść zadania, którą trzeba czytać, czytać i jeszcze raz czytać aż do zrozumienia, a szczególnie gdy ma się z nim problemy: "Na podstawie tych danych, organizatorzy Zlotu chcą określić ile należy kupić ciastek", a dopiero potem, liczą ile to pudełek: "ciastka w sklepie sprzedawane są w pudełkach o stałej wielkości". Z twojego kodu widać, że tego niestety nie zauważyłeś/nie uwzględniłeś.
Witam! Mam problem z zadaniem Obżartuchy, kod sprawdzałem na ideone i wyniki mam dobre, ale sędzia pokazuje mi błąd wykonania (SIGSEGV). Dopiero niedawno zacząłem naukę programowanie i nie mam pojęcia czemu mi nie przyjmuje tego kodu. Proszę o pomoc.
#include <iostream>
using namespace std;
int prob;
int main()
{
cin>>prob;
for (int i=0;i<prob;i++)
{
int pudelka=0, ile_o, ciastka, czas[100], suma=0,doba=86400;
float x[100];
cin>>ile_o>>ciastka;
for(int i=0;i<ile_o;i++)
{
cin>>czas[i];
}
for(int i=0;i<ile_o;i++)
{
if (x[i]=doba%czas[i]==0)
{
x[i]=doba/czas[i];
}
else
{
x[i]=(doba/czas[i])-1;
}
suma+=x[i];
}
if (suma%ciastka==0)
{
pudelka+=suma/ciastka;
cout<<pudelka<<endl;
}
else
{
pudelka+=(suma/ciastka)+1;
cout<<pudelka<<endl;
}
}
return 0;
}
Warto najpierw nauczyć się czytać! Czytać ze zrozumieniem, więc może wróć i zacznij od tego?
W poście nad twoim umieściłem kilka bezcennych rad, przeczytaj i zastosuj się chociaż do pkt. 1 i 5. To ja osobiście, wyedytowałem i poprawiłem Ci formatowanie twojego błędnie wklejonego kodu.
Przemyśl też koniecznie pkt 5. Poniżej malutki fragmencik z treści zadania:
... W pierwszej linii znajdują się dwie liczby całkowite N i M oddzielone pojedynczą spacją (1 ≤ N ≤ 10.000, 1 ≤ M ≤ 1.000.000.000). Oznaczają one odpowiednio liczbę zaproszonych obżartuchów na Zlot oraz liczbę ciastek ....
Czy naprawdę sądzisz, że czas[100] jest na tyle rozciągliwy, aby pomieścić 10000 obżartuchów? Po kiego, tak w ogóle, potrzebne jest Ci wpychanie ich wszystkich w jedną ciasną klatkę? Czy nie możesz, spytać pierwszego, tylko o to, ile czasu je ciastko, zapamiętać [przetworzyć], wpuścić go na Zlot i przejść do następnego?
Całą resztę twojego rozwlekłego kodu, kładę na karb tego, że się dopiero lub zaczniesz uczyć czytać . Życzę powodzenia i wytrwałości.
PS
SIGSEGV wynika właśnie z powodu nierozciągliwości twojego czasu i grzebania po nie przydzielonej pamięci.
PS 2
instrukcja:
x = doba/czas - 1;
jest błędem - dzielenie całkowitoliczbowe jest zawsze ucinane[zaokrąglane do liczby całkowitej w dół] i w tym wypadku nic nie zmienia tego faktu, to, że x jest typu float. Najpierw jest tu wykonywane dzielenie całkowitoliczbowe, a dopiero potem wynik tego dzielenia, konwertowany jest na typ float. Wystarczy więc tylko samo:
x = doba/czas;
bez całej reszty sprawdzania modulo etc.
PS 3
Jeszcze lepiej po prostu:
suma += doba/czas;
Gratuluję!.
Może jeszcze parę uwag?
- Unikaj zmiennych globalnych - zmienna ile prób.
- Nie żałuj spacji - zobacz np mój ps 3
- Jeszcze bardziej wymowne nazwy zmiennych
- Zamisat for (.. tutaj można spokojnie while, np while(prob--){ ..
- Zamiast: int doba=86400 lepiej const int doba = 24*60*60 // = 86400 obliczone w czasie kompilacji
- Zamiast ostatniego bloku if ... else, można cout << ceil ((double) suma/ciastka) ......
- + include cmath
lub cout << (suma + ciastka - 1)/ciastka << ......
- + include cmath
- PS w C tak, w C++ w funkcji main() już nie jest konieczna instrukcja return 0.
Witajcie. Jestem aż tak zły, że muszę wam o tym napisać jaki głupi błąd zrobiłem przez co ciągle mi wyrzucało błąd kompilacji . Spędziłem dzisiaj pół dnia nad tym zadaniem , bo po napisaniu go raz i wyrzucaniu błędu skasowałem wszystko i od nowa napisałem no i bez zmian , ale doszedłem do tego , że nazwałem zmienną z czasem - “time” i za każdym razem błąd kompilacji przez taką pierdołę…
Kompilator zawsze wypisuje komunikat błędu a przy odpowiednim ustawieniu, także ostrzeżenia, więc wystarczy tylko przeczytać i od razu wiedzieć gdzie tkwi problem czy błąd. Tak jest, gdy kompilujesz u siebie lub na ideone. Gdy wysyłasz od razu na spoj’u, wystarczy “kliknąć” w napis błąd kompilacji przy swoim zgłoszeniu i jak wyżej.
Mam problem z zaakceptowaniem przez sędziego mojego kodu. Informuje on o błędzie wykonania (SIGSEGV) . Proszę o pomoc i wskazówki jak mogę poprawić kod. Wyniki wychodzą prawidłowe.
#include <iostream>
using namespace std;
int n;
int main()
{
int t; int suma=0; long m;
cin>>t;
for (int j=1; j<=t; j++){
int tab[n-1]; const int x=24*60*60;
cin>>n>>m;
for (int i=0; i<n; i++){
cin>>tab[i];
suma+=x/tab[i];}
double box = suma/m;
if (box / m >0.1)
{cout<<box+1<<endl;}
else
{cout<<box<<endl;}
}
}
Witam, w C++ programuję od niedawna, od jakiegoś czasu siedzę nad problem, nie wiem gdzie jest błąd, dla przykładowych danych wychodzą mi wyniki 9 i 6032237. Ktoś, coś? https://ideone.com/MFhYdl12
Program nie liczy (wszystkiego) dobrze w takiej postaci, co zresztą sugeruje błąd. Po kliknięciu w link opisu błędu dostaniesz pełen opis segfaulta. Wprowadzenie odpowiedniej poprawki w kodzie (wystarczy jedno zero) daje AC.
Być może pomoże Ci lektura treści zadania, a ściślej zakresów liczb.
Po AC usuń kod.
#include <iostream>
using namespace std;
int ile,grubasy,zjedzone,paczka,zjedzone2,ciastka;
int t[1000];
int pudla;
int main()
{
cin>>ile;
for(int i=1; i<=ile; i++)
{
cin>>grubasy>>ciastka;
for (int i=1; i<=grubasy; i++)
{
cin >>t[i];
zjedzone=86400/t[i];
zjedzone2=zjedzone2+zjedzone;
}
pudla=zjedzone2/ciastka;
if (pudla*ciastka<zjedzone2) {pudla=pudla+1;}
zjedzone2=0;
cout<<pudla<<endl;
}
return 0;
}
Powie mi ktoś co tutaj jest nie tak ? Cały czas błąd wykonania ;/ Program liczy wszystko dobrze
Jakiej pomocy oczekujesz, skoro Twój kod nie działa nawet dla przykładowych testów? https://ideone.com/MSR70J13
Generalnie działa podaję dokładną liczbę dla pojedynczego obżartucha poniżej zaokrągla tą liczbę zsumuje też ilości obżartuchów dla danej próby.
Nie wiem dokładnie co jest nie tak, ale wydaje mi się, że błąd leży w tym, że zaokrągla po każdym obżartuchu, a powinien po każdej próbie, ale nie wiem jak tego dokonać. Już tydzień edytuje ten program i nie mogę nic wymyślić.
Bardzo proszę o pomoc.
Generalnie nie działa. Wyjście, jakie masz mieć to 8 i 2, a nie cuda typu 0.00735467.
Domyślam się, że wyświetlasz jakieś obliczenia pomocnicze, ale nie oczekuj, że ktoś będzie wczytywał się w kod programu, który nie wyświetla tego co powinien i będzie analizował za co odpowiadają kolejne zmienne i jak wyniki pomocnicze mają się do ostatecznego.
Okomentuj albo usuń linie kodu, które wyświetlają cokolwiek innego niż określono w specyfikacji outputu.
EDIT
Rzuciłem okiem na wybrane fragmenty kodu i szczerze mówiąc kiepsko to widzę…
- Nie używaj float do obliczeń zmiennoprzecinkowych, o ile nie jest to absolutnie konieczne
- float obzartuchow[l]; - nie tak alokuje się tablice dynamiczne
- Na SPOJu nie trzeba tablicować wyników
- W tym zadaniu w ogóle nie potrzeba tablic
- Nazwy zmiennych powinny być samoobjaśniające się. y, l oraz o zdecydowanie takimi nie są
- Dlaczego tak mieszasz z zakresami ważności? Czy wiesz do czego służą klamry w cpp?
- Po co Ci iomanip?
- Dlaczego masz nieprawidłową indentację?
EDIT2
Dostosuj się do wymienionych powyżej punktów oraz uwag i jedziemy z koksem