3 / 5
Nov 2015

Ciachnąłem, bo kod sam w sobie działa.

Mam jeden jedyny problem z tym kodem, a właściwie z jego rezultatem uzyskanym po zgłoszeniu. Czas realizacji powyższego kodu to 0.01s, natomiast jego wielkość (według sędziego) to 3.4MB, podczas gdy najlepsze rozwiązania tego zadania w rankingu uzyskują czasy równe 0.00s i rozmiary rzędu 2.5MB dla tego samego C++ 5.

Co mogę zrobić, żeby poprawić ten czas i zmniejszyć wielkość pliku?

  • created

    Nov '15
  • last reply

    Nov '15
  • 4

    replies

  • 1.1k

    views

  • 3

    users

  • 1

    link

Nie dawaj na forum działających rozwiązań

Co do pamięci, to ja zrobiłem to bez tablicy i mam 2.5 MB zużycia. Co do czasu, to mam 0.02 i się tym nie przejmuję, ale możesz spróbować scan/printf zamiast cin/out. Powinno go to przyśpieszyć.

Dodanie:
ios_base::sync_with_stdio(0);
też Ci da 0.00, ale różnica 0.01 czy nawet 0.02 to często granica błędu i nie należy się tym, jak sugeruje @sig, przejmować.
Rozmiaru raczej nie zmniejszysz, bo inne rozwiązania, to wcale nie są dla c++5. Zwróć uwagę, na datę tych zgłoszeń, np [2007], a wtedy przecież nie tylko na SPOJ'u ale nigdzie nie było tego [c++5] kompilatora. Inne drobne niedociągnięcia pomińmy milczeniem wink np.: może to

Chyba właśnie absolutnie pomijać nie wolno, bo przez to nie mam szansy dowiedzieć się o rzeczach (albo jakoś je w procesie nauki pominąłem i same już raczej nie wskoczą do głowy), o których wiedzieć powinienem. Wszystko przeczytałem, przyjąłem i przyswoiłem, więc dzięki, że te kilka kwestii jednak przemilczanych nie zostało wink

Hm, w takim razie:
1. Dobieranie typów zmiennych [całkowitych]. Jeżeli nie wiesz jaki typ wybrać, to najlepiej używaj int. Unsigned tylko wtedy gdy musisz, lub gdy typ signed jest za mały o jeden bit.
2. long v. long long [int64]. W systemach 32 bit, long = int
3. float v. double. Jeżeli nie wiesz czemu, to zawsze stosuj double. [w tym zadaniu wystarczy tylko int, float/double jest zbędny]
4. Jeżeli [tak pkt 3] Zakładamy, że x i y są typu int, to:
(int) floor ( double(x) / y) ===> x / y // bez żadnych rzutowań
(int) ceil ( double(x) / y) ===> (x + y - 1) / y // bez żadnych dodatkowych rzuto.wań
5. Zamiast:
for (int i = 0; i < ileProb; i++)
można while(ileProb--) //zmienna i do niczego nie jest potrzebna
6. Zamiast
for (int j = 0; j < ileZaproszonych; j++)
można: while(ileZaproszonych--) // zmienna j, jężeli nie wczytujesz do tablicy - do niczego nie jest potrzebna
7. int ileProb = 0, ... ciastkaNaDzien = 0 ....
wystarczy:
int ileProb, ... ciastkaNaDzien ...
8. można od razu cout << ceil .....<< endl
lub printf( ....., ceil........)

9 i 10. Zawsze nie wierz każdemu na słowo. Mi także. Sprawdź to wszystko samodzielnie.