Obżartuchy SPOJ - crash programu

0

Witam.
Mam problem z zadaniem Obżartuchy ze SPOJ'a (oczywiście w C++ jest mój program).
Treść zadania znajdziecie pod tym linkiem: http://pl.spoj.com/problems/GLUTTON/
Problem jest taki, że crashuje mi program gdy podaje dane dotyczące czasu jedzenia 1 ciastka. Nieważne czy podam 3600 czy 1 wywala mi program. Na innym forum zapytałem się o ten problem, ale innemu użytkownikowi program zadziałał bez problemu.

 #include <iostream>

using namespace std;

int main()
{
    int ile, IleObzart, IleCiasPudel, *CzasJedz, *IleCiasDoba, s = 0;
    cin >> ile;
    for (int i = 0; i < ile; i++)
    {
        cin >> IleObzart >> IleCiasPudel;

        CzasJedz = new int [IleObzart];
        IleCiasDoba = new int [IleObzart];

        for (int q = 0; q < IleObzart; q++ )
        {
            cin >> CzasJedz[q];                                                //wyglada na to, ze tutaj jest problem
            for (int k = 0; k < IleObzart; k++)
            {
                IleCiasDoba [k] = 86400/CzasJedz [k];
                s+= IleCiasDoba [k];
            }
            if (s%IleCiasPudel==0)
                cout << s/IleCiasPudel << endl;
            else cout << s/IleCiasPudel+1 << endl;
        }
    }
    return 0;
}

Gdy przesyłam kod do SPOJ'a to wyskakuje mi błąd wykonania (SIGFPE)

0

Jesteś pewien że pętla int k powinna być wewnątrz pętli int q? Bo jak ją dałem poza to error zamienił się w błędną odpowiedź. Swoją drogą zrezygnował bym z tych tablic, w tym zadaniu są zbędne.

edit: to zadanie od jakiegoś czasu "współpracuje" z ceil-em z bilioteki math.h (zaokrągla zawsze w górę). Zatem "ręczne" sprawdzanie czy s jest podzielne bez reszty przez ileciasputel jest zbędne.

0
 
        CzasJedz = new int [IleObzart];
        IleCiasDoba = new int [IleObzart];
 
        for (int q = 0; q < IleObzart; q++ )
        {
            cin >> CzasJedz[q];                                                //wyglada na to, ze tutaj jest problem
            for (int k = 0; k < IleObzart; k++)
            {
                IleCiasDoba [k] = 86400/CzasJedz [k];

Masz odwołanie do niezainicjalizowanej zmiennej tutaj: CzasJedz [k]. A to dlatego, że dopiero później następuje wprowadzenie danych do tej zmiennej, ale zanim do tego dojdzie to program może się wywalić, ponieważ w tej zmiennej może się znajdować 0 i dojdzie do dzielenia przez zero ( 86400/CzasJedz [k]; ).

0

Przecież w

cin >> CzasJedz [q] 

podajemy wartość zerowego elementu tablicy. Potem dzielimy przez właśnie ten zerowy element tablicy. Nie znajduje się w nim wartość 0.

0

q i k to różne zmienne.

0

A wystarczy tyle:

#include <cstdio>
using namespace std;

int main()
  {
   unsigned T,N,M,X;
   unsigned long long sum;
   for(scanf("%u",&T);T--;printf("%llu\n",(sum+M-1)/M)) for(sum=0,scanf("%u%u",&N,&M);N--;sum+=24*60*60/X) scanf("%u",&X);
   return 0;
  }
0

Niezbyt rozumiem jakie warunki występują w tych pętlach. Mógłbyś napisać to w wersji słownej, lub z komentarzami? Np nie rozumiem

for (scanf ("%u%", &T)... 

Co to za warunek? Wiem, że jest to wczytywanie, u to jest chyba unsigned.

Ja będę uparty i jak zacząłem tak skończę :P
Zmieniłem trochę kod, ale wynik (przy danych takich jak podaje SPOJ) jest 8 i 3. Tak jakby to +1 tam nie pasowało, ale... to musi tam być.

 #include <iostream>

using namespace std;

int main()
{
    int ile, IleObzart, IleCiasPudel, *CzasJedz, *IleCiasDoba, s = 0;
    cin >> ile;
    for (int i = 0; i < ile; i++)
    {
        cin >> IleObzart >> IleCiasPudel;

        CzasJedz = new int [IleObzart];
        IleCiasDoba = new int [IleObzart];

        for (int q = 0; q < IleObzart; q++ )
        {
            cin >> CzasJedz[q];
            IleCiasDoba [q] = 86400/CzasJedz [q];
            s+= IleCiasDoba [q];
        }
        if (s%IleCiasPudel==0)
        cout << s/IleCiasPudel << endl;
        else cout << s/IleCiasPudel+1 << endl;
    }
    return 0;
}
1

tak minimalistycznie (sorry, ale nie znam c++ jakos super)

#include <iostream>
using namespace std;

int main() {
	unsigned c;
	cin >> c;
	while(c--)
	{
		unsigned n, m, s, r = 0;
		cin >> n >> m;
	 	while(n--)
	 	{
	 		cin >> s;
	 		r += 86400 / s;
	 	}
	 	cout << r / m + !!(r % m) << endl;
	}
	return 0;
}
0

Ok, dobra, łapię :P Po prostu zapomniałem wyzerować zmiennej

s

. Dziękuję wszystkim za pomoc. Finalny kod:

 #include <iostream>

using namespace std;

int main()
{
    int ile, IleObzart, IleCiasPudel, *CzasJedz, *IleCiasDoba, s = 0;
    cin >> ile;
    for (int i = 0; i < ile; i++)
    {
        if (s > 0) s=0;
        cin >> IleObzart >> IleCiasPudel;

        CzasJedz = new int [IleObzart];
        IleCiasDoba = new int [IleObzart];

        for (int q = 0; q < IleObzart; q++ )
        {
            cin >> CzasJedz[q];
            IleCiasDoba [q] = 86400/CzasJedz [q];
            s+= IleCiasDoba [q];
        }
        if (s%IleCiasPudel==0)
        cout << s/IleCiasPudel << endl;
        else cout << s/IleCiasPudel+1 << endl;
    }
    return 0;
}

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