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

SPOJ- GLUTTON - Obżartuchy

Object Storage Arubacloud
0 głosów
653 wizyt
pytanie zadane 30 listopada 2017 w SPOJ przez xveenx Nowicjusz (150 p.)
zmienione kategorie 30 listopada 2017 przez ScriptyChris

Witam, jesli ma ktos chwilke czasu, to prosilbym o przeanalizowanie mojego programu z zadania "Obżarciuchy" i o odpowiedzenie mi dla czego wyskakuje blędna odpowiedź w SPOJu, zdaje sobie sprawe, że kod pewnie mógłby być o wiele lepszy, ale dopiero sie ucze. Pozdrawiam :)

Tutaj jeszcze link do zadania: http://pl.spoj.com/problems/GLUTTON/

 

#include <iostream>
#include <cmath>

using namespace std;
short int n;
int m,t;  //t= proby m=ilosc w pudelku
double wynik; 
int main()
{
cin>>t;
{
    for(int i=1;i<=t;i++)
    {
        cin>>n>>m;
        int nm[n],wnm[n+1]; //nm Pierwszy czas, wnm kolejne czasy
        for(int u=1;u<=n;u++)
        {
            cin>>nm[u];
            if(u==1)wnm[u]=86400/nm[u];
            else if (u==n)
                {
                    wnm[u]=86400/nm[u]+wnm[u-1];
                    wynik=ceil(double(wnm[u])/m);
                }
             else wnm[u]=86400/nm[u]+wnm[u-1];
        }
    cout<<wynik<<endl;
   }

}
    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 1 grudnia 2017 przez Kube Obywatel (1,180 p.)
wybrane 1 grudnia 2017 przez xveenx
 
Najlepsza

Cześć, może nie jestem ekspertem, ponieważ sam się ciągle uczę ale widzę to następująco:

1. Nie ma potrzeby deklarowania zmiennych typu double - typ int spokojnie pomieści maksymalną zadaną liczbę w tym zadaniu (tu było to 1 000 000 000), tym bardziej zmienna wynik, ponieważ wynik musi być typu całkowitego (nie możemy mieć 2,5 pudełka, tylko 3).

2. Przy testowaniu swojego programu nie ograniczaj się jedynie do wartości zadanych w przykładzie. Testuj również w oparciu o analizję wartości brzegowych (czyli zapodaj minimum oraz maksium możliwe w danym przykładzie).

I tutaj właśnie Twój kod się wykrzaczy. Ponieważ deklarując maksymalną ilość ciastek w pudełku, tzn 1 000 000 000 oraz maksymalny czas jedzenia jednego ciastka przez obżartucha (czyli 100 000) widać od razu, że obżartuch nie zdąży zjeść choćby jednego ciastka, a skończy mu się czas.

Więc ilośc zjedzonych przez niego ciastek w całości, wyniesie 0, na co Twój program zareaguje, że potrzeba 0 pudełek.

 

3. Twoje warunki mogą się nie sprawdzić również ilości obżartuchów n=1 (wartość brzegowa minimalna dla ilości obżartuchów), ponieważ wtedy spełni się warunek z if, więc automatycznie program ominie else if oraz else i zakończy się pętla, a pokazane na ekranie zostanie 0 (czyli domyślna wartość początkowa dla zmiennej wynik).

 

4. Nie ma potrzeby tworzenia aż dwóch tablic. Tzn można to zrobić ale muszą one mieć dokładnie taki sam rozmiar (czyli obydwie w rozmiarze n, a nie n oraz n+1).

 

Moja podpowiedź -> Zadeklaruj tablicę, do której poślesz już dla elementu 0 czas trwania dnia w sekundach podzielony przez długość jedzenia jednego ciastka, które zadasz chwile wczesniej w petli. Nastepnie ilosc zjedzonych ciastek sumuj i na koncu podziel ilość ciastek w pudełku przez tą sumę. Pamiętaj, że jeżeli reszta z dzielenia będzie różna od 0, będziesz musiał zwiększyć ilość potrzebnych pudełek o 1 <- ja tak zrobiłem i jest OK. Może znajdzie się ktoś z jeszcze "czystszym" kodem. Pozdrawiam.

komentarz 1 grudnia 2017 przez xveenx Nowicjusz (150 p.)
OK tak zrobie, nie moge jednak zgodzić się z 2 pkt, ponieważ jesli obżarciuch nie zdąży zjesc ciastka przez cały dzien, to go wgl nie zacznie, więc zje 0 ciastek przy czasie 100000 sek.Chyba że coś źle zrozumialem.
komentarz 1 grudnia 2017 przez Kube Obywatel (1,180 p.)
Przy czasie 100000sek ruszy pierwsze ciastko ale go nie zje całego. Tak wiec zeby mógł je ruszyć w ogóle musi mieć choćby jedno pudełko z tymi ciastkami. Tak więc trzeba założyć, że minimalna ilość potrzebnych pudełek bez względu na to ile zjedzonych zostanie liczb całkowitych ciastek, wyniesie 1.
komentarz 1 grudnia 2017 przez xveenx Nowicjusz (150 p.)
Zadanie rozwiązałem pozytywnie :) Wystarczylo dodać wyjątek, o ktorym mowiles w punkcie 3. Pozdrawiam i bardzo dziękuję za pomoc.

Podobne pytania

+1 głos
1 odpowiedź 330 wizyt
pytanie zadane 17 marca 2020 w SPOJ przez Sashimo Użytkownik (740 p.)
0 głosów
0 odpowiedzi 956 wizyt
–1 głos
1 odpowiedź 316 wizyt
pytanie zadane 16 lutego 2019 w SPOJ przez matzar24 Początkujący (250 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...