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

SPOJ - KC022 - Statystyka pozycyjna. Przechodzi wszystkie testy, wciąż "Błędna odpowiedź"

Object Storage Arubacloud
–1 głos
576 wizyt
pytanie zadane 23 lipca 2018 w SPOJ przez Gramad Obywatel (1,660 p.)
edycja 27 lipca 2018 przez Gramad
Jakie jeszcze dane wejściowe mógłbym wypróbować?
Nie mam już pomysłu. Wszystkie testy co wymyślam mi przechodzą, a wciąż dostaję że "Błędna Odpowiedź"

https://pl.spoj.com/problems/KC022/
komentarz 24 lipca 2018 przez Mariusz08 Maniak (62,300 p.)

Cześć! Przenieś swoje pytanie do kategorii SPOJ. Poza tym wstaw Twój kod, łatwiej będzie Ci pomóc. Pzdr

2 odpowiedzi

0 głosów
odpowiedź 24 lipca 2018 przez profesorek96 Szeryf (91,420 p.)
Wklej kod. Spróbuj zamiennić wszystkie zmienne na typy o większej pojemnośći np z float zamien na long double, int na lon long.
komentarz 24 lipca 2018 przez Gramad Obywatel (1,660 p.)
Wrzuciłem kod.
0 głosów
odpowiedź 15 kwietnia 2019 przez koczo21 Początkujący (450 p.)

Cześć,
Nie chcę tworzy nowego wątku więc zadam pytanie tutaj. Mój program(również chodzi o statystykę pozycyjną) daje błędną odpowiedź i nie wiem gdzie może być błąd, wszystkie testy przechodzi poprawnie. Podejrzewam, że jest jakiś scenariusz, dla którego daje błędną odpowiedź tylko nie mogę znaleźć tego scenariusza. Może ktoś z was będzie w stanie mi podpowiedzieć? Poniżej załącznik do kodu programu:

#include<string.h>
#include<iostream>
#include <stdio.h>

using namespace std;

void mymergesort(int *tablica, int lewy, int prawy)
{
    int v=tablica[(lewy+prawy)/2];
    int i,j,x;
    i=lewy;
    j=prawy;
    do
    {
        while(tablica[i]<v) i++;
        while(tablica[j]>v) j--;
        if(i<=j)
        {
            x=tablica[i];
            tablica[i]=tablica[j];
            tablica[j]=x;
            i++;
            j--;
        }
    }
    while(i<=j);
    if(j>lewy) mymergesort(tablica,lewy, j);
    if(i<prawy) mymergesort(tablica, i, prawy);
}

int main()
{
       
       int a;

       while(cin>>a)
       {


       int tab[10000];
       int i=0;
       for(i=0;i<10000;i++)
       {
           if ((cin.peek()=='\n')&&(i==0))cout<<"-"<<endl;
           cin>>tab[i];
           if (cin.peek()=='\n') break;
       }

        int *tab2;
        tab2 = new int[i+1];
        for(int ii=0;ii<=i;ii++)
        {
            tab2[ii]=tab[ii];
        }

        mymergesort(tab2,0,i);

        int x=0;
        for(int ii=0;ii<i-x;ii++)
        {
            if (tab2[ii+1]==tab2[ii])
            {

                for(int iii=ii;iii<=i-1-x;iii++)
                {

                    tab2[iii]=tab2[iii+1];
                }

                x++;
                ii--;
            }
        }
        int *tab3;
        tab3=new int[i-x+1];
        for(int b=0; b<=i-x; b++)
        {
        tab3[b]=tab2[b];
        }

        if((a-1>i-x)||(i==0))cout<<"-"<<endl;
        else cout <<tab3[i-x-a+1]<<endl;
       }



        return 0;
}

 

komentarz 15 kwietnia 2019 przez niezalogowany
W przeciwieństwie do forum SPOJ powinieneś założyć nowy temat.
komentarz 15 kwietnia 2019 przez niezalogowany

Przykładowy wejście:

2 2

Poprawne wyjście:

-
komentarz 15 kwietnia 2019 przez koczo21 Początkujący (450 p.)
I takie wyjście mi wychodzi, więc chyba jest ok.
komentarz 15 kwietnia 2019 przez niezalogowany
U mnie na wyjściu pojawia się losowa liczba.
komentarz 15 kwietnia 2019 przez koczo21 Początkujący (450 p.)
a w czym kompilujesz? bo ja w codeblocks.
komentarz 15 kwietnia 2019 przez koczo21 Początkujący (450 p.)
Za to zauważyłem, że na wejściu "1 2" mam wyjście "-" a powinno być "2", więc już widzę gdzie jest błąd :) zajmę się tym jutro i jak bym miał jakieś problemy dalej to dam znać ewentualnie. Dzięki za pomoc, która mi nakierowała :)
komentarz 15 kwietnia 2019 przez niezalogowany

GCC, Clang, MSVC. CB to nie jest kompilator. Można więc założyć, że masz jakieś UB. Nie chciało mi się sprawdzać kodu, bo jest bardzo nieczytelny. Postaraj się lepiej formatować kod i nazywać sensownie zmiennie. Jeżeli alokujesz tablicę dynamicznie to powinieneś użyć delete[] (jeżeli nie chcesz tego robić użyj std::vector). Wczytywanie liczb też jest jakieś nietypowe. Zamiast pisać własną funkcję sortującą możesz użyć std::sort - przynajmniej unikamy na tym polu błędów ;) Powinieneś zmieścić się w 30 liniach kodu.

komentarz 17 kwietnia 2019 przez koczo21 Początkujący (450 p.)

Dzięki za wskazówki, jestem początkujący i cały czas się uczę :) Starałem się poprawić czytelność kodu .Masz jeszcze jakieś pomysły co może być nie tak? wszystkie wymyślone przeze mnie scenariusze przechodzi ok.

#include<string.h>
#include<iostream>
#include <stdio.h>
#include <cstdlib>

using namespace std;

int compare (const void * a, const void * b)
{
    return ( *(int*)b - *(int*)a );
}
int main()
{
    long int a;

    while(cin>>a)
    {
        if (cin.peek()=='\n') cout<<"-"<<endl;

        long int *tab;
        tab = new long int[100000];
        long int i=0;
        for(i=0; i<100000; i++)
        {
            cin>>tab[i];
            if (cin.peek()=='\n') break;
        }

        //i=rozmiar tablicy -1
        //teraz tworzę tablicę tab2 o odpowiednim rozmiarze
        long int *tab2;
        tab2 = new long int[i+1];
        for(long int i2=0; i2<=i; i2++)
        {
            tab2[i2]=tab[i2];
        }

        qsort(tab2, i+1, sizeof(long int), compare);

        //x=licznik powtarzających się elementów w ciągu do usunięcia
        //teraz usuwam powtarzające się elementy w tab2
        int x=0;
        for(long int i2=0; i2<i-x; i2++)
        {
            if (tab2[i2+1]==tab2[i2])
            {

                for(long int i3=i2; i3<=i-1-x; i3++)
                {

                    tab2[i3]=tab2[i3+1];
                }

                x++;
                i2--;
            }
        }
        //przepisuje do tab 3 elementy z tab 2, rozmiar tablicy pomniejszony o liczbe powtarzajacych sie elementow
        long int *tab3;
        tab3=new long int[i-x+1];
        for(long int b=0; b<=i-x; b++)
        {
            tab3[b]=tab2[b];
        }

        //jesli a jest wieksze od rozmiaru tab3 to wynik jest "=", w przeciwnym razie wynik to "a"element tablicy


        if(a-1>i-x)cout<<"-"<<endl;
        else cout <<tab3[a-1]<<endl;

        delete []tab;
        delete []tab2;
        delete []tab3;
    }

    return 0;
}



 

Podobne pytania

0 głosów
1 odpowiedź 471 wizyt
0 głosów
1 odpowiedź 862 wizyt
pytanie zadane 23 lipca 2018 w SPOJ przez paweljumper Obywatel (1,260 p.)
0 głosów
1 odpowiedź 821 wizyt

92,594 zapytań

141,443 odpowiedzi

319,714 komentarzy

61,980 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...