Zadanie Stół [B] ze strony szkopuł

0

Na wstępie chciałbym zaznaczyć, że dopiero uczę się kodować, dlatego proszę o zrozumienie i w miarę przystępny do zrozumienia język :) Mam problem z testami swojego kodu dla zadania obraz_2023-12-12_231452940.png tzn. napisany przeze mnie kod nie przechodzi następujących testów obraz_2023-12-12_231300612.png i chciałbym się dowiedzieć jakich warunków nie dodałem lub gdzie popełniłem błąd. Z góry dziękuje za wszelkie odpowiedzi.

#include <iostream>

using namespace std;

int main()
{
    unsigned long long int A,B,K,IloscKrzeselA,IloscKrzeselB;
    cin >> A >> B >> K;
    
    if ( A >= 1 && B >= 1 && K >= 1) //Sprawdzamy czy zgodnie z załozeniami zadania
    {                               //A,B,K są większe lub równe 1 
        if(A == B && A == K) //Sprawdzamy czy pole stołu będzie równe polu krzesła. W takim wypadku zmieści się tylko jedno
        {
            cout << 1;
        }
        
        else if (A < K || B < K)//Jesli którys bok bedzie mniejszy od boku krzesla wtedy nie zmiesci sie żadne
        {
            cout << 0;
        }
        
        else if (A > K && B == K)//Jesli bok krzesła jest mniejszy od boku A i równy bokowi B wtedy krzesła umieszczamy tylko wzdłuż boku A
        {
            IloscKrzeselA = A/K;
            cout << IloscKrzeselA;
        }
        
        else if (A == K && B > K)//Jesli bok krzesła jest mniejszy od boku B i równy bokowi A wtedy krzesła umieszczamy tylko wzdłuż boku B
        {
            IloscKrzeselB = B/K;
            cout << IloscKrzeselB;
        }
        
        else if (A > K && B == (K*2))//Przypadek kiedy krzesła zmieszczą się po obu stronach stołu przy boku A
        {
            IloscKrzeselA = (A/K)*2;
            cout << IloscKrzeselA;
        }
        
        else if (B > K && A == (K*2))//Przypadek kiedy krzesła zmieszczą się po obu stronach stołu przy boku B
        {
            IloscKrzeselB = (B/K)*2;
            cout << IloscKrzeselB;
        }
        else if (A > K && (B*2) >= (K*2))//Przypadek kiedy krzesła zmieszczą się po obu stronach stołu i sprawdzamy czy uda się zmieścić krzesła przy bokach o długosci B
        {
            IloscKrzeselA = (A/K)*2;
            IloscKrzeselB = ((B/K)*2) - 4; //odejmujemy 4 krzesła od rogów, które stoją przy bokach o długości A
            cout << IloscKrzeselA + IloscKrzeselB;
        }
        else if (B > K && (A*2) >= (K*2))//Przypadek kiedy krzesła zmieszczą się po obu stronach stołu i sprawdzamy czy uda się zmieścić krzesła przy bokach o długosci A
        {
            IloscKrzeselB = (B/K)*2;
            IloscKrzeselA = ((A/K)*2) - 4; //odejmujemy 4 krzesła od rogów, które stoją przy bokach o długości B
            cout << IloscKrzeselA + IloscKrzeselB;
        }
    } 
    return 0;
}
3

Jako pierwszy krok, przerób kod w ten sposób:

#include <iostream>

int countChairs(int a, int b, int k) {
   // twój właściwy kod do liczenia liczby krzeseł
   return 0;
}

int main()
{
   int a, b, k;
   if (std::cin >> a >> b >> k) {
       std::cout << countChairs(a, b, k) << '\n';
   }
}

Celem jest oddzielenie kodu odpowiedzialnego za operacje IO, od tego który liczy wynik.
Nie musisz sprawdzać poprawności danych wejściowych.

Potem przenieś swoją funkcję do czegoś takiego (testy): https://godbolt.org/z/9fhsssWds
Po prostu sprawdź, czy twój kod przejdzie najostrzejsze możliwe przypadki (pada na dwóch przykładowych danych).

Na pierwszy rzut oka twój kod wygląda zbyt skomplikowanie.

0

Te testy są odpalane przez tę stronę jakoś? Rozumiem, że widzisz jakie są dane wejściowe w teście, i jakie oczekiwane wyjście?

Ogólnie powinieneś odpalić te testy u siebie i dla każdego przypadku testowego (tj. każdych danych wejściowych dla których wiesz, jaki powinien być wynik) zobaczyć co się dzieje pod spodem w twoim kodzie.

Dla każdego przypadku musisz sprawdzić:

  1. Czy w ogóle wchodzi on w któryś z twoich ifów z komentarzem? Jeśli nie, to masz wskazówkę, że jest to przypadek o którym nie pomyślałeś
  2. Czy wchodzi w poprawny if (tj. ten który myślisz że powinien)? Jeśli nie, to masz wskazówkę że źle napisałeś warunek do ifa albo źle zrozumiałeś jaki to jest przypadek
  3. Czy jeśli już wchodzi w poprawny if, to wynik liczy się poprawnie?

Żeby sprawdzić, w które miejsce "wchodzi" kod, najlepiej użyć debuggera - to fajne narzędzie które pozwala ci m.in. uruchamiać program krok po kroku, podglądać wartości zmiennych, czy zatrzymywać uruchomienie w określonych miejscach.

Ewentualnie w ubogiej wersji możesz po prostu wypisywać w różnych miejscach cout'em numer linii kodu i wartości zmiennych ;)

0
#include <iostream>

using namespace std;

int countChairs(int A, int B, int K) 
{
   int IloscKrzeselA = A/K;
   int IloscKrzeselB = B/K;
   if (IloscKrzeselA < 1 || IloscKrzeselB < 1)
   {
     return 0;
   }
   else if (IloscKrzeselA == 1 || IloscKrzeselB == 1)
   {
    return IloscKrzeselA*IloscKrzeselB;
   }

   else if (IloscKrzeselA > 1 || IloscKrzesel > 1)  
   {
    return (IloscKrzeselA*IloscKrzeselB) - ((IloscKrzeselA - 2)*(IloscKrzeselB - 2));
   }

   return 1;
}

int main()
{
   int A, B, K;
   if (cin >> A >> B >> K) 
   {
       cout << countChairs(A, B, K) << '\n';
   }
}   

Po zmianie na taką wersje wszystkie testy przeszły; zarówno na godbolt jak i na szkopule :) dzięki wielkie za pomoc

0
int countChairs(int a, int b, int k)
{
    if (a < b)
        std::swap(a, b);

    if (b < k)
        return 0;

    if (b < 2 * k)
        return a / k;

    return 2 * (a / k + b / k - 2);
}

https://godbolt.org/z/jW8hG1TK5

I jeszcze dla zabawy wersja bez if-ów (branchless):

int countChairs(int a, int b, int k)
{
    int diff = a - b;
    b = b + (diff & (diff >> std::numeric_limits<int>::digits));
    a = a - (diff & (diff >> std::numeric_limits<int>::digits));
    return ((b >= k) + (b >= 2 * k)) * a / k + 2 * (b >= 2 * k) * (b / k - 2);
}

https://godbolt.org/z/vT98M8bEa

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