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

C++ - pytanie - Szkopuł

0 głosów
1,018 wizyt
pytanie zadane 12 marca 2021 w C i C++ przez jpor3 Nowicjusz (170 p.)

Hej! Od pewnego czasu zainteresowałem się algorytmiką. Zacząłem rozwiązywać w C++ różne zadania ze SPOJa i systemu Szkopuł (obsługującego OI i OIJ). Teraz zabrałem się za zadanie "Minusy" (https://szkopul.edu.pl/problemset/problem/xB0uOrHG0vxqYqG2Y-Nhjlzu/site/?key=statement). Podczas rozwiązywania przykładowych problemów z zadania, wynik u mnie lokalnie wychodzi poprawny. Podobnie na Ideone - jest tak jak powinno być. Tymczasem po wgraniu do systemu Szkopuł i wybraniu odpowiedniego języka wyskakuje błąd, punktacja 0/100 i informacje, że w każdym z przeprowadzonych testów wynik wynosił 134513184 zamiast wartości oczekiwanej. Czy ktoś, kto miał doczynienia z tym systemem może powiedzieć co może być tego przyczyną. Poniżej zamieszczam mój kod. Wiem, że nie jest idealnie, ale uczę się. Najpierw wczytuję ciąg znaków, następnie zamieniam każde 2 minusy na plus (zgodnie z zadaniem) i na końcu algorytmem gąsienicowym liczę największy ciąg minusów. Nie wiem co jest tu nie tak... Każdy test zwraca dokładnie ten sam wynik...

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie();
    cout.tie();

    int idX=0, start=0, koniec=0, suma_tymczasowa;
    int najwiecej_minusow;
    string wczytywanie;
    vector <int> plusy_minusy;

    cin >> wczytywanie;
    
    while(idX<wczytywanie.length())
    {
        if(wczytywanie[idX]=='+')
        {
            plusy_minusy.push_back(43);
        } else if(wczytywanie[idX]=='-'&&wczytywanie[idX+1]=='-')
        {
            plusy_minusy.push_back(43);
            idX++;
        } else
        {
            plusy_minusy.push_back(45);
        }
        idX++;
    }

    while(koniec<plusy_minusy.size())
    {
        suma_tymczasowa = 0;
        for(int i=start; i<=koniec; i++)
        {
            suma_tymczasowa += plusy_minusy[i];
        }

        if((suma_tymczasowa%43)==0||koniec-start==0)
        {
            if((koniec-start+1)>najwiecej_minusow)
                najwiecej_minusow=koniec-start+1;
            koniec++;
        } else
            start++;
    }

    cout << najwiecej_minusow;

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 12 marca 2021 przez Whistleroosh Maniak (57,400 p.)
wybrane 10 kwietnia 2021 przez jpor3
 
Najlepsza
Problem jest w tym, że algorytm jest błędny. Zobacz sobie taki przypadek:

---+

Twój program zwróci 1, a powinno być 2. Wynika to z tego, że zachłannie zamieniasz 2 pierwsze minusy w plus i w powyższym przypadku otrzymujesz +-+. Czasami może być tak, że bardziej opłaca się zamienić ostatnie 2 minusy na plus, wtedy dostałbyś -++.

Poza tym algorytm jest za wolny, co jest spowodowane pętlą w linii 38. A szkopul zwraca dziwne wyniki, bo zmienna najwiecej_minusow nie jest zainicjalizowana.

Podobne pytania

0 głosów
1 odpowiedź 470 wizyt
pytanie zadane 24 grudnia 2022 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
0 odpowiedzi 170 wizyt
pytanie zadane 13 kwietnia 2022 w C i C++ przez dubajstan Nowicjusz (160 p.)
0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 12 września 2023 w C i C++ przez Sophix Początkujący (270 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...