FLAMASTER (SPOJ) - błąd odpowiedzi

0

Witam :) mam pewien problem, zrobiłem to zadanko ze spoja (treść zadania: http://pl.spoj.com/problems/FLAMASTE/ ) i jak wpisuje dane to wyniki mi dobre wyskakują, mógłby ktoś spojrzeć dlaczego mi nie chce tego zaakceptować ? pozdrawiam :)


import java.util.Scanner;

public class Slowo {

    public static void main (String [] args)
    {
        Scanner in = new Scanner (System.in);
        String slowo;
        int licz;
        char znak,znak2;
        char tab[] =new char[200];
        char tab2[] =new char[200];
        int ile=1;
        int p = in.nextInt();

        for (int q=0;q<=p;q++) {

            slowo = in.nextLine();
            licz = slowo.length();


            for (int i = 0; i < slowo.length(); i++) {
                tab[i] = slowo.charAt(i);
                // System.out.println(tab[i]);
            }
            for (int j = 0; j < licz-1; j++) {
                tab2[j] = slowo.charAt(j+1);
                // System.out.println(tab[j]);
            }

            for (int k = 0; k < licz; k++) {
                ile=1;
                while (tab[k] == tab2[k])
                {
                    ile++;
                    k++;

                }
            if (ile < 2) {
                System.out.println(tab[k]);

            }

            else if (ile ==2 ){
                System.out.println(tab[k]);
                System.out.println(tab[k]);


            }

            else {
                System.out.println(tab[k]);
                System.out.println(ile);


            }

            }

            }

        }

    }


0

zmień sposób wczytywania danych ze Scannera na BufferedReader

0

powiem szczerze, że jeszcze nie słyszałem o tym bo dopiero zaczynam przygodę z programowaniem ale zaraz to ogarnę :)

0

jaki masz błąd w ogóle? jeśli przekroczenie czasu to zastosuj sę do mojej rady. Scanner jest wolniejszy jeżeli chodzi o wczytywanie danych od BufferedReader

0

no właśnie o przekroczeniu czasu nic nie ma, tylko wywala mi błędną odpowiedź, jak wpisuje u siebie jakieś przykłady to dobrze liczy

3
for (int q=0;q<=p;q++)

Nazwij zmienne sensownie, a nie jakieś p, q.
Teraz zagadka: jeśli było 20 zestawów danych, czyli p == 20, to ile razy ta pętla się wykona? Podpowiedź: nie 20 razy.

I formatuj kod, bo w tej chwili wcięcia to jakaś amerykanka: http://www.tutorialspoint.com/online_java_formatter.htm

0

tez mnie to zastanawiało, ale jak wpisuje

 for (int q=0;q<p;q++) 

to mogę tylko 19 razy wpisać dane, więc wtedy się wykonuje 19 razy chyba, a powinno tak być, że przy wpisaniu 20 powinno się robić 20 razy. Np jak przy takiej pętli wpisuje 3 to mogę tylko dwa zestawy wpisać a powinno być 3, dlatego też dodałem "=" żeby wykonywała się te 3 razy, ale czemu tak jest nie mam pojęcia

0

Powiedz sobie na głos, co się dzieje podczas każdego przejścia pętli, gdy p=3 (razem z ciałem pętli, tj. sprawdzanie warunku oraz inkrementowaniem q++). To powinno Ci odpowiedzieć na pytanie.

0

coś z tym scannerem jest chyba bo jak wpisałem jakieś słowo na sztywno to wtedy się wykonuje 3 razy po wpisaniu 3, tylko nie wiem jak to rozwiązać ;/
nie może być nextLine po nextIncie ? bo nie wiem już jak to ogarnąć;P tak jakby dostawał jakieś info i przeskakiwał do końca pętli, dopiero druga i trzecia się dobrze wykonuje

0

problem z pętlą rozwiązany, wystarczyło po

 int p = in.nextInt ();

dodać

in.nextLine ();

i pętla for (q=0;q<p;q++)

  już wykonuje się normalnie, co nie zmienia faktu, że i tak jest błąd odpowiedzi;P
0

To znaczy ze algorytm działa niepoprawnie i tyle. Wprowadź dane inne niż te przykładowe i porównaj też format wyjścia, bo ma znaczenie czy wyniki masz np. w osobnyc liniach czy nie.

0

wprowadzałem różne dane i chyba chodzi o format wyjścia właśnie, bo wyniki pokazuje dobre ale jeden pod drugim.

0

o_O No jak robisz println czyli print LINE to czemu się dziwisz? println dodaje na koniec znak nowej linii.

0

Masz błąd wyniku bo zamiast wynik wyświetlać w jednej linii np:

wejście:
AASSDDDD

u Ciebie wyjście wygląda tak:
A
A
S
S
D
4

a powinno wyglądać:
AASSD4

0

mój błąd...i to taki głupi ;/ zaraz to poprawie ;) skupiłem się bardziej żeby to na stringa zamienić

0

Poprawione, możliwe jest że nie akceptuje bo jest wprowadzenie - wynik -wprowadzenie -wynik ?

0

a jaki masz błąd? podawaj więcej szczegółów...

0

Wcześniej napisałem ;) pokazuje mi "Błędna odpowiedź" a z tego co wpisywałem jakieś przykładowe dane to pokazuje dobrze

0

aktualnie wygląda tak :

import java.util.Scanner;

public class Slowo {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String slowo;
        int licz;
        char tab[] = new char[200];
        char tab2[] = new char[200];
        int ile = 1;
        int p = in .nextInt(); in .nextLine();
        for (int q = 0; q < p; q++) {

            slowo = in .nextLine();
            licz = slowo.length();


            for (int i = 0; i < slowo.length(); i++) {
                tab[i] = slowo.charAt(i);
            }
            for (int j = 0; j < licz - 1; j++) {
                tab2[j] = slowo.charAt(j + 1);
            }

            for (int k = 0; k < licz; k++) {
                ile = 1;
                while (tab[k] == tab2[k]) {
                    ile++;
                    k++;

                }
                if (ile < 2) {
                    System.out.print(tab[k]);
                } else if (ile == 2) {
                    System.out.print(tab[k]);
                    System.out.print(tab[k]);

                } else {
                    System.out.print(tab[k]);
                    System.out.print(ile);

                }

            }
            System.out.println();
        }

    }

}
1

Więc tak.

po pierwsze zamiast pisać

int p = in .nextInt(); in .nextLine();

napisz

int p = Integer.parseInt(in.nextLine());

kolejna rzecz szanuj swoje palce i zamiast


            for (int i = 0; i < slowo.length(); i++) {
                tab[i] = slowo.charAt(i);
            }

wystarczy napisać

char tab;
...


 tab = slowo.toCharArray();

druga spraw

zamiast pisać

char tab2[] = new char[200];

napisz

char tab2[];

...

tab2 = new char[licz];

ze względu np. na oszczędność pamięci.

po tych zmianach u mnie zaakceptowało odp. prędkość wczytywania Scannerem w tym zadaniu nie ma znaczenia.

0

Dzięki bardzo :) zaakceptowane, problem tkwił w tablicach ;)

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