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

Zadanie SPOJ- średnia arytmetyczna

HackNation - ogólnopolski hackathon
0 głosów
1,346 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,940 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,940 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,940 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,940 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ź 416 wizyt
pytanie zadane 15 lutego 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
2 odpowiedzi 447 wizyt
0 głosów
0 odpowiedzi 397 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez Flaxi Nowicjusz (120 p.)

93,624 zapytań

142,544 odpowiedzi

323,031 komentarzy

63,129 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 968p. - dia-Chann
  2. 959p. - DziarnowskiJ
  3. 941p. - Łukasz Piwowar
  4. 940p. - CC PL
  5. 930p. - Maurycy W
  6. 913p. - Adrian Wieprzkowicz
  7. 913p. - Tomasz Bielak
  8. 906p. - ssynowiec
  9. 899p. - raydeal
  10. 889p. - rucin93
  11. 885p. - Dominik Łempicki (kapitan)
  12. 878p. - Mariusz Fornal
  13. 874p. - robwarsz
  14. 847p. - Grzegorz Aleksander Klementowski
  15. 649p. - Michal Drewniak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...