14 / 43
Jul 2021

co do pkt 3 to ja mam to wyliczone w tym miejscu, chyba, że czegoś tu nie rozumiem

for (int k=0; k<obzartuch; k++)
{
wynik+= floor(86400/czas);
}

tylko ze zmienna czas moze przechowac jedna liczbe, a kazdy obzartuch moze jesc w roznym tempie.

Poprawiłem kod, teraz już wszystko niby dobrze zlicza i wypisuje, ale jest jakiś problem z zaokrągleniami bo czasami przeskakuje wynik o 1 jednostkę - ma ktoś jakiś pomysł co może być błędnego w tym kodzie?

#include
#include
using namespace std;

int main()
{
int testy, obzartuch, czas, ciastka;
long double zjedli=0, paczki=0;

cin>>testy;
cin.ignore();
for (int i=0; i<testy; ++i)
{
 cin>>obzartuch;
 cin.ignore ();
 cin>>ciastka;
 cin.ignore ();
   {for (int j=0; j<obzartuch; ++j)
      {
       cin>>czas;
       cin.ignore ();
       zjedli+=floor(86400/czas);
      }
    paczki= ceil(zjedli/ciastka);
    cout<<paczki<<endl;
   }
}
return 0;

Cały czas dodajesz do zmiennej zjedli, powinna ona być zerowana przy każdej iteracji pętli.

W swoim króciutkim kodzie 4 razy wywołujesz funkcję cin.ignore(). Możesz mi zdradzić jaka jest idea tego działania?

A dlaczego powinna być zerowana? Wyliczam ile ciastek w ciągu doby zjada każdy obżartuch i to sumuje a następnie już za pętla ten zsumowany wynik przykładam do liczby ciastek w pudełku i powinna wyjść ilość paczek. I z grubsza wychodzi ale przy liczbach z zakończeniem kilka miejsc po przecinku coś nie zaokrągla jak powinien pomimo że dałem typ long double …

i naprawdę dobrze ci liczy dla kilku testów ?? To ciekawe…
Bo to co widzę wyżej to jest coś takiego :
zjedli=0;
pętla:
zjedli rośnie kila razy
koniec petli, zjedli = 10;
paczki…
znow piętla
zjedli=10 + costam…

Dałeś typ Long doble - bez sensu. Wiesz jak wygląda wynik/wydruk cout << long double ?
Chodzi o format. A tak w ogóle jak testujesz jak testujesz swoje programy?

Myślę, ze Twój problem polega na tym, że nie przemyślałeś dokładnie podanych wskazówek i źle testujesz swój kod. Przecież Twój program nie daje poprawnego wyniku dla danych testowych. Zobacz jaki ciekawy wynik uzyskasz, gdy w danych testowych zmienisz kolejność podawanych danych na:
2
3 356
123
32999
10101
2 10
3600
1800
Wynik jest ko(s)miczny… :slight_smile:
Przemyślałeś to co Ci napisała Yula?
Do każdego testu zmienna zjedli wchodzi z wartością z poprzedniego testu.
Tak więc Twój algorytm, może poprawnie liczyć tylko dla takiej sytuacji, gdy masz jeden przypadek testowy.

Dzięki wszystkim, faktycznie źle to obmyslilem z tymi pętlami. A co do innych kwestii to:

  1. testuję w Code blocks
  2. dałem long double bo myślałem że będzie dokładniej zaokraglal iloraz ale widzę że nie ma takiej potrzeby
  3. Cin ignore używam bo tak polecał w swoim kursie Drzewniak - czyli nie ma takiej potrzeby?

Drzewniak poleca ja nie. Poczytaj w dokumentacji-referencji co to jest i do czego i sam decyduj.
Czyli testujesz w konsoli, a to czesto za słabo

4 months later

Cześć.

Jestem “mocno początkujący”, proszę o pomoc.
W Code::Blocks oraz ideone.com6 kod działa natomiast sędzia w spoj wyrzuca błąd wykonania (SIGSEGV).

#include

using namespace std;

int ile;

int main()
{
cin>>ile;
for(int i=1; i<=ile; i++)
{
float n,m;
cin>>n>>m;
int suma=0;
float t[3];
for (int i=0; i<n; i++)
{
cin>>t[i];
}
for (int i=0; i<n; i++)
{
suma+=(86400/t[i]);
}

int ip2;
float ip,ip3;
ip=suma/m;
ip2=ip;
ip3=ip-ip2;

if (ip3!=0)
{
    ip2++;
}
cout<<ip2<<endl;
}
return 0;

}

skoro jesteś “mocno początkujący” to może przeczytaj post dla początkujących ? Co robi tablica t i skąd wziął się jej rozmiar? Gdzie trafiają dane dla n większe od 3? Już wiesz skąd naruszenie pamięci ?

Dziękuje za odpowiedź.

Przed napisaniem wiadomości przeczytałem post dla początkujących i starałem się postępować według tego co było tam napisane:

  • starałem się wyszukać rozwiązanie na forum zanim napisałem wiadomość ale nie znalazłem

  • nie założyłem nowego wątku tylko napisałem wiadomość już w istniejącym, dotyczącym tego problemu

  • wkleiłem kod według instrukcji (wkleiłem kod skopiowany z strony ideonem.com1 za pomocą ikonki kopiuj ponieważ, gdy wklejałem link to w mojej wiadomości nie pojawiał się on ani kod tylko taki obrazek:
    blad

  • nie obraziłem nikogo, byłem kulturalny i pisałem poprawnie

Jeżeli zrobiłem coś źle to nie jestem świadomy co zrobiłem źle i nadal będę to robił chyba że mnie uświadomisz albo wyrzućcie mnie po prostu z tego forum.

Jeżeli chodzi o mój kod to:
"…Co robi tablica t…" - przechowuje czasy pojedynczo zjedzonych ciastek.
"…i skąd się wziął jej rozmiar…" - rozmiar nadałem jej 3 ponieważ do wykonania programu podane są 2 testy w których są maksymalnie 3 czasy.
Rozumiem że sędzia testuje więcej więcej niż 3 czasy dlatego kod mój nie jest poprawny dlatego zmieniłem go tak (zastosowałem dynamiczne alokowanie pamięci) aby był możliwe stosowanie więcej niż 3 czasów. Nazwę zmiennej t zmieniłem też na nazwę czas. Niestety dostaje informacje “Błędna odpowiedź” pomimo, że wyniki testów w Code::Blocks są poprawne.

Podejrzewam, że napisałaś:
"skoro jesteś “mocno początkujący” to może przeczytaj post dla początkujących ?.."
dlatego, że źle wkleiłem kod więc wklejam nowy kod jako tekst bezpośrednio z Code::Blocks:

#include

using namespace std;

int ile,ip2,n;
float ip,m,ip3;

int main()
{
cin>>ile;
for(int i=1; i<=ile; i++)
{
cin>>n>>m;

int  suma=0;

float *czas;
czas = new float [n];

for (int i=0; i<n; i++)
{
cin>>czas[i];
}

for (int i=0; i<n; i++)
{
suma+=(86400/czas[i]);
}

ip=suma/m;
ip2=ip;
ip3=ip-ip2;

if (ip3!=0)
{
    ip2+=1;
}
cout<<ip2<<endl;
delete []czas;
}
return 0;

}

Proszę o pomoc.

w poście dla początkujących o ile dobrze pamiętam pisało by dla udostępniania kodu używać odpowiednich tagów by był w całości a nie pokawałkowany, a jeszcze lepiej LINK do ideone z kodem i testami… Bo teraz by sprawdzić twój kod muszę kopiować 3 kawałki i domyślać sie bibliotek…
np: https://ideone.com/qSIXxm3

zastanów sie jak to zrobić na intach… Ten kod mi przeszedł jak zmieniłam na inty oraz dodałam jedną linijkę do sprawdzenia pełnych pudełek
zamiast tego
ip=suma/m;
ip2=ip;
ip3=ip-ip2;

4 months later

Cześć
Mam ten sam problem co u reszty, czyli w codeblocksie działa ale sędzia daje błędną odpowiedź. Jeśli ma ktoś wolną chwilę to proszę o pomoc

cout<<"wczt2"<<endl;
cout<<"wczt1"<<endl;
Oto przyczyna. Na wyjściu ma się znależć dokładnie to, czego chce autor. Wypisanie nawet jednej litery a w jakimkolwiek miejscu (albo np. “TAK” zamiast “tak”) spowoduje błędną odpowiedź. Pewną swobodę masz jedynie, jeśli chcesz dodać więcej białych znaków niż jest wymagane (albo zamiast spacji wypisywać ‘\n’ i vice versa), ale i to nie we wszystkich zadaniach (jak w treści napisane jest, że włączony jest sędzia dokładny, wyjście musi być IDEALNIE zgodne z tym, czego chce autor. Brak jednej spacji albo nadmiarowy ‘\n’ na końcu spowoduje błędną odpowiedź).

A, no i jak usuniesz powyższe wypisywanie to okaże się, że całe wyjście twojego programu jest sklejone bez żadnych białych znaków. Dodaj w odpowiednim miejscu wypisywanie spacji albo newline i powinno śmigać.

Dzieki bardzo; zarówno tu na formum jak i do sprawdzenia przez sędziego załączyłem nie zaktualizowany kod. Te wczyty miały mi tylko pomóc sprawdzić gdzie mój kod dochodzi i gdzie się kończy. Jeszcze raz dziękuje i przepraszam.

Kolega już napisał co trzeba zrobic