SPOJ - Obżartuchy i błąd kompilacji

SPOJ - Obżartuchy i błąd kompilacji
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Cześć! Zrobiłem to: http://pl.spoj.com/problems/GLUTTON/ zadanie ze SPOJA. U mnie wynik jest prawidłowy, a przy zgłaszaniu zadania wywala mi błąd kompilacji. Uprzedzam, że przy wykonywaniu tego zadania nie miałem praktycznie pojęcia o szablonie vector, więc kod to spaghetti. :D

Kopiuj
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int testy = 0, obzartuchy = 0, ciastka = 0, czas = 0;
	vector<int> N;

	cin >> testy;
	vector<int> suma(testy);
	for (int i = 0; i < testy; ++i)
	{
		cin >> obzartuchy >> ciastka;
		for (int j = 0; j < obzartuchy; ++j)
		{
			cin >> czas;
			N.push_back((((3600 / czas) * 24) + ciastka - 1) / ciastka);
			suma[i] += N[j];
		}
		N.clear();
	}

	for (int i = 0; i < testy; ++i)
	{
		cout << suma[i] << endl;
	}

	system("pause");
	return 0;
}
edytowany 1x, ostatnio: Wylte
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:43 minuty
  • Lokalizacja:Szczecin
0

Być może chodzi o

Kopiuj
system("pause");

funkcja system jest w nagłówku <cstdlib>


Zobacz pozostałe 5 komentarzy
Lucas Darkstorm
Lucas Darkstorm
Bo aplikacje konsolowe są tworzone z myślą o konsoli, więc taki początkujący powinien nauczyć się obsługiwać konsolę, a nie robić takie bezsensowne tricki pod pretekstem, że konsola się dzięki temu nie zamyka. Serio, to się w przyszłości bardzo przydaje, gdyż nie tylko możesz się nauczyć, jak wszystko wygląda "od środka", ale też daje to większe możliwości (jak chociażby sprzężanie ze sobą kilku programów przy użyciu potoków) aniżeli ciągłe poleganie na okienkach.
NJ
to tak jak się spodziewałem, nie, bo nie(między nami, podałbym 2 lepsze powody dla których lepiej nie używać pause) :) Nie zrozum mnie źle, nie jestem zwolennikiem system("pause"), są lepsze metody(mniej"zasobożerne": cin.get(), getchar(), ale z drugiej strony kiedy ktoś się uczy, to mu lata to JAK zatrzyma środowisko, ważne by wynik było widać. A jeśli chodzi o "wyższą" zabawę z potokami, wątkami i jakimiś bajerami, to jak to zrozumiał to ma na tyle rozumu i wie, że nie powinno się powłoki pauzować lol :P
kq
To jest po prostu uczenie się złych nawyków. Jest to nieprzenośne, więc ten kod na osx/linuksie nie zadziała zgodnie z oczekiwaniami autora. Ponadto wewnątrzprogramowe zatrzymywanie przed wyjściem to raczej zły nawyk, do celów deweloperskich można konsolę zatrzymać inaczej (lub po prostu uruchomić program z konsoli! Albo wybrać dobre IDE, które już samo się tym zajmie, np. Qt Creator), nie kalecząc programu.
NJ
@kq chyba że sie nie używa IDE :P tez bym podał te argumenty, nie licząc złych nawyków :P Tak jak pisałem, jest wiele innych rozwiązań mniej zasobożernych(lepiej już wywołać getchar(), niż babrać sie z systemem), bo w tą stronę bym się skłaniał kiedy bym przekonywał o nie używaniu system("pause").
kq
Jak się nie korzysta z IDE to tym bardziej nie ma powodu aby nie odpalić konsoli a z niej programu, dzięki czemu nie ma problemu "rozwiązanego" użyciem system(&quot;PAUSE&quot;) lub innym podobnym wynalazkiem.
0

A jakis konkretny błąd kompilacji rzuca?

Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Po dodaniu nagłówka <cstdlib> wywala "błędna odpowiedź".

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

To system pause musisz wywalić oczywiście, a reszta wygląda ok. Przecież nie możesz na końcu programu wypisać jakiejś pauzy z d**y skoro zadanie tego nie wymaga...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Wywalone. Nadal "błędna odpowiedź". Może to coś z formatowaniem kodu (wstawianie endl; itp.)?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:43 minuty
  • Lokalizacja:Szczecin
0
Wylte napisał(a):

Po dodaniu nagłówka <cstdlib> wywala "błędna odpowiedź".

To oznacza, że Twój program nie wykonuje poprawnych obliczeń. Sprawdź sobie wartości dla danych testowych, utwórz swoje własne i oblicz ich spodziewane wyniki a potem krok po kroku prześledź działanie swojego kodu i znajdź błąd.


Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@Wylte a może po prostu twój algorytm jest błędny? ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Przecież wszystko było misternie obliczane. :D Zaraz sprawdzę, ale dla danych testowych wychodziło poprawnie.

edytowany 1x, ostatnio: Wylte
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0
Kopiuj
N.push_back((((3600 / czas) * 24) + ciastka - 1) / ciastka);

Ta linia wygląda mocno podejrzanie. Zupełnie nie potrafię zgadnąć po co + ciastka - 1, ale wiem na pewno, że (3600 / czas) * 24 jest błędne, bo przy czasie > 3600 to Ci zawsze zwróci 0.
Inna sprawa, że nie wiem po co vector N skoro i tak zaraz bierzesz tę wartość do sumy.

Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0
Kopiuj
+ ciastka - 1 

żeby zaokrąglić. Korzystałem z tego http://stackoverflow.com/questions/2745074/fast-ceiling-of-an-integer-division-in-c-c

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

A po co zaokrąglić?
kiedy to uczestnikowi nie wolno napocząć ciastka jeśli wie, że nie zdąży go zjeść przed końcem doby

Chcesz obliczać ile pudełek trzeba dla każdego uczestnika. Czyli jeśli pierwszy potrzebuje 1/3, a drugi 1/3 to Twoja odpowiedź będzie 2, bo jedno pudełko dla pierwszego i jedno dla drugiego. A tak naprawdę wystarczy jedno.

edytowany 2x, ostatnio: twonek
MarekR22
gdzie jest to w treści napisane, że padałka są na obżartucha a nie na sesję obżarstwa?
twonek
no właśnie nie powinny być, a kod liczy jakby były
MarekR22
nie masz racji popatrz na dane testowe drugi zestaw. 3 obzatuchów, którzy zjedzą: 702, 2, 8 ciastek a wynik to 2 a nie 4.
twonek
tylko dlatego, że miał drugi bug (3600/czas)*24, przez co dla drugiego i trzeciego wychodziło mu po 0 pudełek
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
0

Ja w zatwierdzonym programie mam ile=ile+(86400/czas),a potem ew dodaję jedno jak mi dzielenie przez liczbę ciastek w pudełku wyjdzie inne niż jeden. Zresztą masz tu gotowca dla przykładu, bo przekombinowałeś

Kopiuj
 
#include <iostream>

using namespace std;

int main ()
{
    int ilzest;
    cin >> ilzest;
    for (int z=1; z<=ilzest;z++)
    {
        int gosc,ciastka,ile=0;
        cin >> gosc;
        cin >> ciastka;
        for (int i=0;i<gosc;i++)
        {
            int czas;
            cin >> czas;
            ile=ile+(86400/czas);

        }
        if (ile%ciastka==0) ile=ile/ciastka;
        else ile=(ile/ciastka)+1;
        cout << ile << endl;

    }

}
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Wiem, że przekombinowałem, ale zaakceptowało. :D

Kopiuj
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
	int testy = 0, obzartuchy = 0, czas = 0, ciastka = 0;

	cin >> testy;
	vector<double> suma(testy);
	for (int i = 0; i < testy; ++i)
	{
		cin >> obzartuchy >> ciastka;
		for (int j = 0; j < obzartuchy; ++j)
		{
			cin >> czas;
			suma[i] += (3600.0 / czas) * 24.0;		
		    suma[i] = floor(suma[i]);	
		}
		suma[i] /= ciastka;
	}
	for (int i = 0; i < testy; ++i)
	{
		cout << ceil(suma[i]) << endl;
	}

	return 0;
} 
edytowany 1x, ostatnio: Wylte
twonek
zamiast kombinować z double i floor() wystarczy 24 * 3600 / czas
Wylte
Tak, wiem, kolega wyżej użył 86400/czas.
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Ja tak zagmatwałem ten kod, bo myślałem, że SPOJ jest czuły na to jak wygląda output (to moje pierwsze zadanie na SPOJU). Zrobiłem tak, że najpierw podaje się dane, a dopiero na końcu są wyświetlane wyniki, więc musiałem je przechować w vectorze, a tu sprawa jest o wiele prostsza. Nie wiedziałem, dzięki za pomoc. :)

edytowany 1x, ostatnio: Wylte

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.