Zadanie ze SPOJ-a – dlaczego nie akceptuje mojego kodu?

0

Siema .Spoj nie akceptuje mojego kodu do zadania http://pl.spoj.com/problems/PP0604A/ mimo poprawnych wyników w wykonanych przeze mnie testach.Jeżeli jakaś dobra duszyczka ma chęć pomóc mi w znalezieniu problemu będzie mi w **** miło :) A oto mój kod:

#include <iostream>

using namespace std;
int m;//   Ilosc liczb
int suma=0;//suma liczb
int *tab=new int[m]; //tablica przechowujaca liczby
float a;//zmienna do przechowania sredniej
float *bat=new float[m];//tablica przechowujaca roznice miedzy srednia a liczba


int main()
{
    int t;//ilosc testow
    cin>>t;
    for(int i=1; i<=t; i++)
    {

        cin>>m;
        cout<<endl;
        for (int j=0; j<m; j++)
        {

            cin>>tab[j];
            cout<<endl;

            suma+=tab[j];
        }

        a=(float)suma/m;





        for(int k=0; k<m; k++)
        {

            bat[k]=tab[k]-a;            //Przypisanie roznicy miedzy liczba a srednia do tablicy
            if(bat[k]<0)
                bat[k]=bat[k]*(-1);
        }
        float x=bat[0];
        int y=0;//zmienna przechowujaca indeks tablicy zawierajacej najmniejsza roznice 
        for(int n=1; n<m; n++)
        {
            if(bat[n]<x)
            {
                x=bat[n];
                y=n;
            }
        }

        suma=0;
        cout<<tab[y]<<endl;
        delete []tab;
        delete []bat;


    }



    return 0;
}
0

A jak brzmi błąd wyświetlany po sprawdzeniu przez automat? Po to właśnie sprawdzarka zwraca błędy, abyś się dowiedział co poszło nie tak.

0

Jeszcze nie wiem czemu, ale iterując od końca po tablicach jest dobry wynik. Tzn. dla danej tablicy (np. dla pierwszego testu ze strony: [1, 2, 3, 4]) iterując od końca, szukam minimum absolutnej wartości: element - średnia i na końcu zwracam ten element (przechowywany w jakiejś tymczasowej zmiennej).

3

Jak sobie wyobrażasz, jaki rozmiar ma ta tablica?

int m;//   Ilosc liczb
int suma=0;//suma liczb
int *tab = new int[m];

Innymi słowy, ile jest równe tutaj m?

Poza tym, ta tablica floatów jest kompletnie niepotrzebna.

0
enedil napisał(a):

Jak sobie wyobrażasz, jaki rozmiar ma ta tablica?

int m;//   Ilosc liczb
int suma=0;//suma liczb
int *tab = new int[m];

Innymi słowy, ile jest równe tutaj m?

Poza tym, ta tablica floatów jest kompletnie niepotrzebna.

Czyli kolejnosc powinna byc taka że najpierw podam do wejscia podam m a pozniej zadeklaruje wskaźnik ?

furious programming napisał(a):

A jak brzmi błąd wyświetlany po sprawdzeniu przez automat? Po to właśnie sprawdzarka zwraca błędy, abyś się dowiedział co poszło nie tak.

Komunikat ktory sie wyświetla to: Błąd wykonania (SIGABRT)

1
Tomasz Ratkiewicz napisał(a):

Czyli kolejnosc powinna byc taka że najpierw podam do wejscia podam m a pozniej zadeklaruje wskaźnik ?

Tak, o ile kompilator wspiera VLA.

2

Czyli kolejnosc powinna byc taka że najpierw podam do wejscia podam m a pozniej zadeklaruje wskaźnik ?

Deklaruj gdziekolwiek, ale alokuj pamięć, gdy już znasz rozmiar.

0
enedil napisał(a):

Jak sobie wyobrażasz, jaki rozmiar ma ta tablica?

int m;//   Ilosc liczb
int suma=0;//suma liczb
int *tab = new int[m];

Innymi słowy, ile jest równe tutaj m?

Poza tym, ta tablica floatów jest kompletnie niepotrzebna

Dzięki wielkie za pomoc, nie wpadłbym na to, nie czaje tylko czemu program sie nie sypał.(rzeczywiście tablica floatów jest zbędna ). Dziękówa i pozdrawiam.

0
Tomasz Ratkiewicz napisał(a):

[…] nie czaje tylko czemu program sie nie sypał.

Bo owe m mogło przez przypadek przyjmować niedużą liczbę – program zaalokował na tyle dużo pamięci, że wystarczyło jej do działania, ale z drugiej strony na tyle mało, aby nie spowodować błędu.

Wszak UB nie oznacza, że coś na pewno nie zadziała. ;)

Edit: faktycznie m jest zerowane, więc program po prostu grzebie w śmieciach.

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