181 / 192
Apr 2020

Sędzia zaakceptował i wyszło na to, że używając funkcji zaokrąglających (jak wiadomo podać im trzeba liczby jako float) lecz myślałem, że skoro zwracają one liczbę zaokrągloną (całkowitą) to można ją zapisać do int. Niestety wychodzi na to, że nie i to co zwraca funkcja (np. ceil lub floor) może być zapisane do float. Tak samo próbując dodać liczbę całkowita, która jest zdefiniowna jako float.
Nie jestem pewien czy te podpowiedzi miały na celu pokazać to ale udało mi się drogą prób i błędów do tego dojść i kod został jak już wspomniałem zaakceptowany przez sędziego.

PS. Czy usunąć powyższy kod z racji, że w połączeniu z ta wiadomością i umiejętnością czytania ze zrozumieniem daje rozwiązanie?

Rozważmy to wyrazenie:

int suma, ile ciastek;
float pudelkaTemp;
pudelkaTemp = suma / ileCiastek;
pudelka[i] = ceil(pudelkaTemp);

Gdy masz dzielenie dwóch liczb całkowitych dodatnich i wynik nie byłby liczbą całkowitą to zostaje on zaokrąglony w dół do najbliższej liczby całkowitej np. 3/4=0, 6/4=1 itp.
Wygląda o tak jak działanie funkcji floor.
A więc z prawej strony masz liczbę całkowitą. Z lewej strony masz zadeklarowaną liczbą zmiennoprzecinkową a więc dokonana jest niejawna konwersja liczby int na float. Następnie w swoim kodzie kodzie zaokrąglasz tę w liczbę w górę ale to działanie nic już nie zmieni, bo wcześniej miałeś zaokrąglenie w dół. Jeśli chcesz by liczba pudelka była naprawdę liczbą float musisz dokonać konwersji licznika na typ float (pytanie konkursowe - dlaczego wystarczy przekonwertować sam licznik a nie ma potrzeby robić tego z mianownikiem). Możesz robić to jawnie przy pomocy np. static_cast lub niejawnie np. w ten sposób:

        pudelkaTemp=(0.0+suma)/ileCiastek;

Co do kodu to oczywiście go usuń by nie kusić innych słabych duchem :slight_smile:

  1. Moim zdaniem, nie ma to najmniejszego znaczenia z wielu powodw. Ci sabi duchem i tak maja najwyrazniej klopoty z polaczeniem tych umiejetnosci. Nastepny powod, to taki, ze ci slabi duchem tak balagania na forum, zamiast najpierw czytac, ze powoli nikt juz nie zapanuje nad balaganem i nadmiarem wszelkiej informacji, a tym bardziej takiej informacji, gdzie trzeba laczyc wiecej umiejetnosci niz tylko jedna. No i ci “slabi duchem”, maja bardzo slaba lub wcale umiejetnosc czytania ze zrozumieniem [umiejetnosc czytania + umiejetnosc rozumienia], wiec goto 1.

Ponoć każdy był kiedyś “słaby duchem”. Tylko niektórzy starali się “zahartować”, a częśc z nich robiła to lepiej niż pozostali.

8 days later

Hej! Mam problem z sędzią w tym zadaniu. Wyskakuje mi błędna odpowiedź, a jak dopiszę “delete [] czas” to wywala mi błąd wykonania (SIGABRT) :frowning: U mnie na konsoli wszystko działa. Wyniki na wyjściu są takie same jak w przykładzie tj. 8 i 2. Używam c++4.3.2

  1. sprawdz skladnie delete.
  1. Czy moglbys wyedytowac swoj post oraz wkleic kod poprawnie? Skorzystaj z przycisku </>

SIGABORT jest z powodu:

for (int i = 1; i <= N; i++) {
   cin>>czas[i];

zmień na:

i = 0;  i < N; ...

I suma_c, warto [trzeba] za każdym razem wyzerować:

for (.....) {
   double suma_c = 0;
   .....

Cześć wszystkim! :wink:
chciałbym zwrócić uwagę, że w treści zadania albo u sędziego jest błąd! Przypomnę fragment, do którego się doczepiłem:
"Jak tylko obżartuch skończy jeść jedno ciastko to od razu musi zabrać się za następne (nie dotyczy to sytuacji pod koniec doby, kiedy to uczestnikowi nie wolno napocząć ciastka jeśli wie, że nie zdąży go zjeść przed końcem doby)."
Tymczasem program chce, abyśmy sumowali ciastka razem z tymi częściami, za które gościom brać się nie wolno.
Pomyślałem, że warto abyśmy się w przyszłości o takich rzeczach informowali :wink:

Może twój program, mój program ani tego robić nie chce ani mu to nawet przez myśl nie przeszło, nie przychodzi teraz i nigdy nie przyjdzie w przyszłości.

To była twoja decyzja, aby do sumowania użyć typu zmiennoprzecinkowego. Ja użyłem w tym celu typu całkowitego.

Pomyślałem, że warto abyśmy się w przyszłości o takich rzeczach informowali :wink:

Narazie daruj sobie, bo sam masz problemy i nie ogarniasz spoja, więc pewnie nie wiesz co piszesz!? :wink: Tutaj w tym zadaniu nigdzie nie ma i nie było żadnego błędu. Wszstko jest ok.

sam se daruj. Co to wgl jest za komentarz? Wiem, że to jest forum, ale nie musisz być bucem. Fakt, jestem nowy na spoju, ale jeszcze wiem co piszę. I nie mój program, ale chodzi o sędziego. On zalicza zadanie, jak się doda te części ciastek, które nie powinny być zjedzone. I tyle.

Witam. Jest to pierwsze zadanie jakie wykonuje na spoj’u a z jezykiem c++ mam stycznosc od zaledwie 3 tygodni wiec jestem mocno poczatkujacy. Na tym forum wielokrotnie padla podpowiedz ze to zadanie mozna rozwiazac bez tablic i dla mnie w tym momencie pojawia sie problem bo nie przychodzi mi do glowy zaden inny pomysl jak poprostu przypisac kolejne wartosci do kolejnych szufladek. No bo na przykladzie zadania mamy podane tylko 2 testy i w pierwszym tescie jest tylko 2 obzartuchow a w drugim tescie 3…Od bidy moge zrobic tyle osobnych intow ale jezeli ktos poda wartosc 5 testow albo 18 obzartuchow to bym musial napisac 18 intow dla samych obzartuchow co nie ma sensu. Dodam jeszcze ze jak robilem to zadanie z tablicami to przekombinowalem i w trakcie sie pogubilem wiec musialem skasowac caly kod i zaczac od poczatku. Jak sie do tego zabrac? Nie chce gotowego rozwiazania tylko jakas wskazowke. Z gory dziekuje.

Nie masz racji. Przetestowalem to na liczbach zmiennoprzecinkowych z zaokraglaniem w dol oraz bez niego. (mam na mysli obliczenie ilosci ciastek zjedzonych przez obzartucha)
Moze masz na mysli jakis inne miejsce w obliczeniach. moze wymysliles zupelnie inny algorytm.
Nie trzeba sie denerwowac jak ktos precyzyjnie analizuje wypowiedzi na forum.
Moge wyslac Ci moje testy na priv.

On zalicza zadanie, jak się doda te części ciastek, które nie powinny być zjedzone

Kompletnie nie rozumiem o co ci chodzi, widzę też, że ty nie rozumiesz treści zadania. Po prostu, przeczytaj sobie jeszcze raz treść zadania albo tyle razy ile potrzeba by je zrozumieć.
I jeszcze jedno. Wyzywanie od buców kogoś kto zwrócił ci słuszną uwagę nie jest dobrym początkiem na portalu.
Brak zrozumienia treści zadania za pierwszym razem to nie jest wielki wstyd, niektóre zadania czytałem wiele razy. Obrażanie innych, zwłaszcza gdy nie ma się za wiele sensownego do powiedzenia w temacie to już inna sprawa.

Nie potrzebujesz tablic bo wyniki możesz wypisywać po każdym teście, na bieżąco. Podejrzewam, że najpierw zbiorczo pobierałeś dane, a później zbiorczo wypisywałeś wyniki. Mam rację?

Tutaj masz dzielenie liczb calkowitych, ktore zaokragla w dół. tak naprawde nie liczysz tych ulamkow o ktorych pisalismy wczesniej.

Tak korkirw masz racje. Zaczalem od poczatku. Przerobilem kod ktory teraz wyglada tak:


Wszystko jest ok tylko nie mam pojecia jak to zrobic zeby moj program zaokraglal ulamki w gore a nie w dol… moge w swoim algorytmie poprostu dopisac “+1” ale moze jest jakis inny sposob na to bo dla innego czasu zjadania ciastka wynik moze wyjsc nieprawidlowy.

Gdy masz dzielenie dwóch liczb całkowitych dodatnich to wynik zawsze jest zaokrąglany w dół. By mieć “zwykłe” zaokrąglanie musisz to robić dla liczb zmiennoprzecinkowych np. dla typu double. Przykład:
int a, b;

a/b;
będzie zaokrąglony w dół.
Jeśli a skonwertujesz do typu double to wynik też będzie double i możesz go zaokrąglać w górę przy użyciu funkcji “ceil”, oczywiście musisz pamiętać o dołączeniu biblioteki cmath
Możesz też dokonać niejawnej konwersji np. w taki sposób:
(0.0+a)/b;
Tu też wynik jest już typu double, który możesz odpowiednio zaokrąglić.
P.S.
Dlaczego w Ideone kodu wykonywałeś w Javie? Przecież kod jest napisany w C++

Dziekuje za pomoc. A co do tej javy w ideone to poprostu przeoczenie.

Czy ktos wie dlaczego pierwszy wynik jest dobry czyli 8 a drugi wynik jest zly czyli 3 zamiast 2?

Oto fragment tresci zadania:
uczestnikowi nie wolno napocząć ciastka jeśli wie, że nie zdąży go zjeść przed końcem doby

Witam powie mi ktos czemu to się nie zapętla ? Program działa dobrze lecz wykonuje sie tylko raz nie zapetla sie w miejscu wskazanym w kodzie

#include <iostream>

using namespace std;
int iloscwejsc,ludzie,ciastka;
int main()
{
cin>>iloscwejsc;
for(int i=0;i<iloscwejsc;i++)  ///////////// ta petla wykonuje sie tylko raz
{
    cin>>ludzie>>ciastka;
    int czas[ludzie];
    int suma=0;
    for(i=0;i<ludzie;i++)
    {
        cin>>czas[i];
        suma+=86400/czas[i];
    }
    if(suma%ciastka>0)
    cout<<(suma/ciastka)+1<<endl;
    else
        cout<<suma/ciastka<<endl;


}

return 0;
}

W obydwu pętlach masz taką samą nazwę licznika “i”, daj w drugiej pętli np. k.

Po co dajesz tablicę na zmienną czas?

  1. Jest niepotrzebna.
  2. Jest niepoprawnie deklarowana. Dla tablicy statycznej jej rozmiar musi być znany już w momencie wykonania, tak można robić z tablicą dynamiczną

Ewentualnie, w drugiej, wewnętrznej pętli, zabrakło deklaracji int.
W takich przypadkach, zamiast pętli for, można użyć pętli while:

 while (iloscwejsc--) {

Cześć wszystkim. Mógłby ktoś zerknąć co może być nie tak z moim kodem? Sam nie potrafię znaleźć błędu.
To mój pierwszy post więc przepraszam z góry jeśli coś źle wstawię. Z góry dzięki.

#include

using namespace std;
int how_many=0,person=0;
long cookies=0;
int pack=0;
int time=86400;
int main()
{
cin>>how_many;
for(int i=1;i<=how_many;i++)
{
pack=0;
cin>>person>>cookies;
int t[person];
int p[person];
int c[person];
for(int i=0;i<person;i++)
{
cin>>t[person];
c[person]=time/t[person];
p[person]=c[person]/cookies;
pack+=p[person];
}
if(c[person]%cookies==0)
{
cout<<pack<< endl;
}
else if(c[person]%cookies>0)
{
pack+=1;
cout<<pack<<endl;
}

}


return 0;

}

1 month later

Witam, również mam problem z kodem do tego zadania mimo iż u siebie uruchamiam normalnie program i wyskakują mi poprawne odpowiedzi tak jak na https://ideone.com/u4j8Yc3 mimo to kod nie przechodzi przez SPOJA prosiłbym o pomoc z góry dziękuje .

  1. Obżartuchy nie potrzebuja osobnych pudelek dla siebie, powiedzmy ze przed zjedeniem przekladaja na swoj talerzyk.
  2. Używana wartość 0.01 nie wynika z tresci zadania. Czy nie jest ona po to zeby podrasowac wynik ?
  3. Test pokazujacy bledy.
    wejscie:
    3
    1 1
    863
    1 1
    864
    1 1
    865
    prawidlowe wyjście:
    100
    100
    99

dobra zadanko zrobione, dzięki za wszystkie 3 uwagi sprowadzały się one tak naprawdę do wcześniejszej odpowiedzi której komuś tam udzieliłeś “Oto fragment tresci zadania:
uczestnikowi nie wolno napocząć ciastka jeśli wie, że nie zdąży go zjeść przed końcem doby”
(nie doczytałem zadania, dzięki wielkie za pomoc ! )