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

Zadanie SPOJ- średnia arytmetyczna

VPS Starter Arubacloud
0 głosów
733 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 (155,460 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 (155,460 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 (155,460 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 (155,460 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ź 210 wizyt
pytanie zadane 15 lutego 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
2 odpowiedzi 228 wizyt
0 głosów
0 odpowiedzi 238 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez Flaxi Nowicjusz (120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...