• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie SPOJ- średnia arytmetyczna

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,086 wizyt
pytanie zadane 14 lipca 2019 w C i C++ przez Padomen Początkujący (260 p.)

Dlaczego SPOJ odrzuca mi ten kod. Poproszę o sugestie dlaczego mój problem występuje.

Link do zadania:https://pl.spoj.com/problems/PP0604A/

#include <iostream>

using namespace std;

int t;
        void sortowanie(int n,float ko[])
        {
            for (int y=0;y<n;y++)
            {
            for (int i=1;i<n;i++)
            {
                if(ko[i]>ko[i+1])
                {

                    swap(ko[i],ko[i+1]);

                }
            }
            }
        }
int main()
{
    cin>>t;
    for (int y=1;y<=t;y++)
    {

    int n;
    cin>>n;
    int liczba[n];
    for (int i=1;i<=n;i++)
    {
        cin>>liczba[i];
    }

    float sr[t];
    for (int i=1;i<=n;i++)
    {
        sr[y]+=liczba[i];
    }
    sr[y]/=n;


    float od[n];
    for (int i=1;i<=n;i++)
    {
        od[i]=sr[y]-liczba[i];
    }
    for (int i=1;i<=n;i++)
    {
        if (od[i]<0)
        {
            od[i]*=-1;
        }
    }


    float ko[n];
    for (int i=1;i<=n;i++)
    {
        ko[i]=od[i];


    }
    sortowanie(n,ko);

    for (int i=1;i<=n;i++)
    {

       if (ko[1]==od[i])
        {
            cout<<liczba[i]<<endl;
            break;
       }
    }
    }

    return 0;
}

 

komentarz 14 lipca 2019 przez Padomen Początkujący (260 p.)
można jaśniej?
komentarz 14 lipca 2019 przez Padomen Początkujący (260 p.)
a poza tym sortuje bo z tego co mi sie wydaje na spoju dla przykladu 1 2 3 4 wynikiem jest 2 a w 4 3 2 1 wynik to 3 bo jezeli liczby po odjęciu od średniej dają ten sam wynik to ta pierwsza podana jest właściwą
komentarz 14 lipca 2019 przez mokrowski Mędrzec (158,200 p.)

bo jezeli liczby po odjęciu od średniej dają ten sam wynik to ta pierwsza podana jest właściwą

No właśnie. Pierwsza w podanym ciągu a Ty sortowaniem ten ciąg modyfikujesz.

komentarz 15 lipca 2019 przez Padomen Początkujący (260 p.)
ustalam która jest najmniejsza potem porównuję z normalnym ciągiem liczb. 54 linijka nie zmienia sie kolejność
komentarz 15 lipca 2019 przez mokrowski Mędrzec (158,200 p.)

Koszt Twojego rozwiązania:

1. Pamięciowo: 

   tablica na dane + tablica na "odległości od średniej"

  Potrzebujesz 2 * n pamięci czyli na 200 (bo 100 może być maksymalnie) liczb.

(mniejszych kosztów na zmienne itp już nie liczę).

2. Obliczeniowo:

  wykonanie wczytania danych + wykonanie obliczenia średniej + wykonanie obliczenia odległości od średniej + sortowanie, znalezienie najmniejszej wartości

O(n) + O(n) + O(n) + O(n^2) + O(n) == O(n^2)

To zbędne sortowanie, dyskwalifikuje Ci zaliczenie.

W proponowanym (nie tylko tu... poszukaj na forum... w stopce "Podobne pytania") rozwiązaniu:

1. Pamięciowo:

  tablica na dane - czyli 100 elementów

2. Obliczeniowo

wykonanie wczytania danych + obliczenie średniej + znalezienie najbliższej wartości

O(n) + O(n) + O(n) == O(n)

1 odpowiedź

–1 głos
odpowiedź 15 lipca 2019 przez Noak Mądrala (5,900 p.)
Nie można deklarować tablicy przez zmienną. Kompilator musi wiedzieć ile ma zaalokować pamięci już w czasie kompilacji. Dlatego zamiast pisać tab[zmienna] powstawiaj tam tab[102] (Z treści zadania wiemy że nie będzie więcej niż 100 elementów w tablicy. +1 bo pętle numerujesz od 1 i +1 dla bezpieczeństwa dlatego 102). Wyeliminuje to problemy z pamięcią. Spróbuj wysłać tą zmienioną wersję jak to nie wystarczy to będziemy szukać błędu.

PS. Jeśli chcesz alokować pamięć przez zmienną poczytaj o tablicach dynamicznych.
komentarz 15 lipca 2019 przez mokrowski Mędrzec (158,200 p.)
Z tą numeracją to raczej przemyśl bo nie jest to prawda. Jeśli będzie maksymalnie 100 liczb, to tablica[100] jest odpowiednia. Wywody o numeracji są ..... nieprawidłowe.
komentarz 16 lipca 2019 przez Noak Mądrala (5,900 p.)
Rzeczywiście trochę się walnąłem ale to tylko 1 czy 2 komórki różnicy, a większa ilość komórek daje nam gwarancje bezpieczeństwa. Poza tym ważniejszym aspektem jest błędna alokacja pamięci niż to czy zaalokuje się 100 czy 102 komórki pamięci.
komentarz 16 lipca 2019 przez mokrowski Mędrzec (158,200 p.)
1. Kontenerów w C++ nie indeksuje się od 1 tylko od 0.

2. Do wielkości kontenera podaje się tylko tyle ile potrzeba elementów. Dodawanie "na zapas" w żadnym wypadku przed niczym nie zabezpiecza. Od tego są inne mechanizmy kompilatora. Porzuć takie pomysły bo są z gruntu błędne.
komentarz 23 lipca 2019 przez Padomen Początkujący (260 p.)

poprawiłem kod ale nadal spoj nie przyjmuje nie wiem czy o to wam chodzilo

#include <iostream>
#include <math.h>
#include <cstdlib>

using namespace std;

int t;


int main()
{
    cin>>t;
    for (int y=0;y<=t-1;y++)
    {

        int n;
        cin>>n;
        int liczba[n-1];
        float sr[t];

                for (int i=0;i<=n-1;i++)
                {
                cin>>liczba[i];
                sr[y]+=liczba[i];
                }

        sr[y]/=n;
        float od[n],poprawny,a;

                for (int i=0;i<=n-1;i++)
                {
                od[i]= fabs(sr[y]-liczba[i]);
                }

                poprawny=od[n-1];
                a=od[n-1];

                for(int i=1;i<=n-1;i++)
                {
                    if(poprawny>od[i])
                    {
                        poprawny=od[i];
                        a=liczba[i];
                    }
                }
                cout<<a<<endl;

    }
    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 15 lutego 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
2 odpowiedzi 318 wizyt
0 głosów
0 odpowiedzi 348 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez Flaxi Nowicjusz (120 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...