SPOJ - Obżartuchy i błąd kompilacji

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

#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;
}
0

Być może chodzi o

system("pause");

funkcja system jest w nagłówku <cstdlib>

0

A jakis konkretny błąd kompilacji rzuca?

0

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

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...

0

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

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.

1

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

0

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

0
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.

0
+ ciastka - 1 

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

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.

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ś

 
#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;

    }

}
0

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

#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;
} 
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. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1