SPOJ - Obżartuchy i błąd kompilacji

SPOJ - Obżartuchy i błąd kompilacji
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Cześć! Zrobiłem to: http://pl.spoj.com/problems/GLUTTON/ zadanie ze SPOJA. U mnie wynik jest prawidłowy, a przy zgłaszaniu zadania wywala mi błąd kompilacji. Uprzedzam, że przy wykonywaniu tego zadania nie miałem praktycznie pojęcia o szablonie vector, więc kod to spaghetti. :D

Kopiuj
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int testy = 0, obzartuchy = 0, ciastka = 0, czas = 0;
	vector<int> N;

	cin >> testy;
	vector<int> suma(testy);
	for (int i = 0; i < testy; ++i)
	{
		cin >> obzartuchy >> ciastka;
		for (int j = 0; j < obzartuchy; ++j)
		{
			cin >> czas;
			N.push_back((((3600 / czas) * 24) + ciastka - 1) / ciastka);
			suma[i] += N[j];
		}
		N.clear();
	}

	for (int i = 0; i < testy; ++i)
	{
		cout << suma[i] << endl;
	}

	system("pause");
	return 0;
}
edytowany 1x, ostatnio: Wylte
kq
Moderator C/C++
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
0

Być może chodzi o

Kopiuj
system("pause");

funkcja system jest w nagłówku <cstdlib>


Zobacz pozostałe 5 komentarzy
Lucas Darkstorm
Lucas Darkstorm
Bo aplikacje konsolowe są tworzone z myślą o konsoli, więc taki początkujący powinien nauczyć się obsługiwać konsolę, a nie robić takie bezsensowne tricki pod pretekstem, że konsola się dzięki temu nie zamyka. Serio, to się w przyszłości bardzo przydaje, gdyż nie tylko możesz się nauczyć, jak wszystko wygląda "od środka", ale też daje to większe możliwości (jak chociażby sprzężanie ze sobą kilku programów przy użyciu potoków) aniżeli ciągłe poleganie na okienkach.
NJ
to tak jak się spodziewałem, nie, bo nie(między nami, podałbym 2 lepsze powody dla których lepiej nie używać pause) :) Nie zrozum mnie źle, nie jestem zwolennikiem system("pause"), są lepsze metody(mniej"zasobożerne": cin.get(), getchar(), ale z drugiej strony kiedy ktoś się uczy, to mu lata to JAK zatrzyma środowisko, ważne by wynik było widać. A jeśli chodzi o "wyższą" zabawę z potokami, wątkami i jakimiś bajerami, to jak to zrozumiał to ma na tyle rozumu i wie, że nie powinno się powłoki pauzować lol :P
kq
To jest po prostu uczenie się złych nawyków. Jest to nieprzenośne, więc ten kod na osx/linuksie nie zadziała zgodnie z oczekiwaniami autora. Ponadto wewnątrzprogramowe zatrzymywanie przed wyjściem to raczej zły nawyk, do celów deweloperskich można konsolę zatrzymać inaczej (lub po prostu uruchomić program z konsoli! Albo wybrać dobre IDE, które już samo się tym zajmie, np. Qt Creator), nie kalecząc programu.
NJ
@kq chyba że sie nie używa IDE :P tez bym podał te argumenty, nie licząc złych nawyków :P Tak jak pisałem, jest wiele innych rozwiązań mniej zasobożernych(lepiej już wywołać getchar(), niż babrać sie z systemem), bo w tą stronę bym się skłaniał kiedy bym przekonywał o nie używaniu system("pause").
kq
Jak się nie korzysta z IDE to tym bardziej nie ma powodu aby nie odpalić konsoli a z niej programu, dzięki czemu nie ma problemu "rozwiązanego" użyciem system(&quot;PAUSE&quot;) lub innym podobnym wynalazkiem.
0

A jakis konkretny błąd kompilacji rzuca?

Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Po dodaniu nagłówka <cstdlib> wywala "błędna odpowiedź".

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

To system pause musisz wywalić oczywiście, a reszta wygląda ok. Przecież nie możesz na końcu programu wypisać jakiejś pauzy z d**y skoro zadanie tego nie wymaga...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Wywalone. Nadal "błędna odpowiedź". Może to coś z formatowaniem kodu (wstawianie endl; itp.)?

kq
Moderator C/C++
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
0
Wylte napisał(a):

Po dodaniu nagłówka <cstdlib> wywala "błędna odpowiedź".

To oznacza, że Twój program nie wykonuje poprawnych obliczeń. Sprawdź sobie wartości dla danych testowych, utwórz swoje własne i oblicz ich spodziewane wyniki a potem krok po kroku prześledź działanie swojego kodu i znajdź błąd.


Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@Wylte a może po prostu twój algorytm jest błędny? ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Przecież wszystko było misternie obliczane. :D Zaraz sprawdzę, ale dla danych testowych wychodziło poprawnie.

edytowany 1x, ostatnio: Wylte
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0
Kopiuj
N.push_back((((3600 / czas) * 24) + ciastka - 1) / ciastka);

Ta linia wygląda mocno podejrzanie. Zupełnie nie potrafię zgadnąć po co + ciastka - 1, ale wiem na pewno, że (3600 / czas) * 24 jest błędne, bo przy czasie > 3600 to Ci zawsze zwróci 0.
Inna sprawa, że nie wiem po co vector N skoro i tak zaraz bierzesz tę wartość do sumy.

Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0
Kopiuj
+ ciastka - 1 

żeby zaokrąglić. Korzystałem z tego http://stackoverflow.com/questions/2745074/fast-ceiling-of-an-integer-division-in-c-c

twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

A po co zaokrąglić?
kiedy to uczestnikowi nie wolno napocząć ciastka jeśli wie, że nie zdąży go zjeść przed końcem doby

Chcesz obliczać ile pudełek trzeba dla każdego uczestnika. Czyli jeśli pierwszy potrzebuje 1/3, a drugi 1/3 to Twoja odpowiedź będzie 2, bo jedno pudełko dla pierwszego i jedno dla drugiego. A tak naprawdę wystarczy jedno.

edytowany 2x, ostatnio: twonek
MarekR22
gdzie jest to w treści napisane, że padałka są na obżartucha a nie na sesję obżarstwa?
twonek
no właśnie nie powinny być, a kod liczy jakby były
MarekR22
nie masz racji popatrz na dane testowe drugi zestaw. 3 obzatuchów, którzy zjedzą: 702, 2, 8 ciastek a wynik to 2 a nie 4.
twonek
tylko dlatego, że miał drugi bug (3600/czas)*24, przez co dla drugiego i trzeciego wychodziło mu po 0 pudełek
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 godziny
0

Ja w zatwierdzonym programie mam ile=ile+(86400/czas),a potem ew dodaję jedno jak mi dzielenie przez liczbę ciastek w pudełku wyjdzie inne niż jeden. Zresztą masz tu gotowca dla przykładu, bo przekombinowałeś

Kopiuj
 
#include <iostream>

using namespace std;

int main ()
{
    int ilzest;
    cin >> ilzest;
    for (int z=1; z<=ilzest;z++)
    {
        int gosc,ciastka,ile=0;
        cin >> gosc;
        cin >> ciastka;
        for (int i=0;i<gosc;i++)
        {
            int czas;
            cin >> czas;
            ile=ile+(86400/czas);

        }
        if (ile%ciastka==0) ile=ile/ciastka;
        else ile=(ile/ciastka)+1;
        cout << ile << endl;

    }

}
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Wiem, że przekombinowałem, ale zaakceptowało. :D

Kopiuj
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
	int testy = 0, obzartuchy = 0, czas = 0, ciastka = 0;

	cin >> testy;
	vector<double> suma(testy);
	for (int i = 0; i < testy; ++i)
	{
		cin >> obzartuchy >> ciastka;
		for (int j = 0; j < obzartuchy; ++j)
		{
			cin >> czas;
			suma[i] += (3600.0 / czas) * 24.0;		
		    suma[i] = floor(suma[i]);	
		}
		suma[i] /= ciastka;
	}
	for (int i = 0; i < testy; ++i)
	{
		cout << ceil(suma[i]) << endl;
	}

	return 0;
} 
edytowany 1x, ostatnio: Wylte
twonek
zamiast kombinować z double i floor() wystarczy 24 * 3600 / czas
Wylte
Tak, wiem, kolega wyżej użył 86400/czas.
Wylte
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:hogwartIOkolice
  • Postów:30
0

Ja tak zagmatwałem ten kod, bo myślałem, że SPOJ jest czuły na to jak wygląda output (to moje pierwsze zadanie na SPOJU). Zrobiłem tak, że najpierw podaje się dane, a dopiero na końcu są wyświetlane wyniki, więc musiałem je przechować w vectorze, a tu sprawa jest o wiele prostsza. Nie wiedziałem, dzięki za pomoc. :)

edytowany 1x, ostatnio: Wylte
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)