6 / 54
May 2017

Witam , mam problem ponieważ spoj odrzuca mój kod jako błędny a wydaje mi się że działa poprawnie mógłby ktoś mnie naprowadzić gdzie może być błąd?

include

//#include

include

using namespace std ;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int ile,suma,wynik,modulo,dzielenie,M,N,s;

int main() {
cin>>ile; //podajemy ile mamy zestawow tesowych
for(int i ; i<ile ; i++){
cin>>N; // podaj ilu mamy obzartuchow

	cin>>M; // podaj ile jest ciastek w pudelku
	int *tablica ;
	tablica = new int [N,2];
	int *tablica2 ;
	tablica2= new int[N];

		for(int j=0 ; j<N ; j++){
			tablica[j,0]=j+1;

		//	cout<<tablica[j,0]<<endl;
			for(int k=1 ; k<2 ;k++){

				cin>>tablica[j,k];
				tablica2[j]=86400/tablica[j,k];
			//	cout<<tablica[j,1]<<endl;
				suma +=tablica2[j];
			}
		}
	modulo = suma % M ; 
	dzielenie = suma/M ;

	if (suma<M){
		cout<<1<<endl;
	}
	else {
		if(modulo==0){
		cout<<suma/M<<endl;	
		suma = 0 ;
	}
		else if (dzielenie*M>suma){
			cout<<suma/M<<endl;
			suma = 0 ;
		}	
			else if (dzielenie*M<suma){
				cout<<(suma/M)+1<<endl;
				suma = 0 ;
			}



	}
delete [] tablica ;
delete [] tablica2 ;	
}



return 0;

}

  • created

    Feb '17
  • last reply

    Mar '22
  • 53

    replies

  • 2.9k

    views

  • 19

    users

  • 12

    likes

  • 7

    links

Frequent Posters

There are 53 replies with an estimated read time of 7 minutes.

z polecenia:
"uczestnikowi nie wolno napocząć ciastka jeśli wie, że nie zdąży go zjeść przed końcem doby"
sprawdź np dla danych:
1
1 100
86401
twój program: 1
poprawna odp: 0

2 months later

Chciałbym podpiąć się pod temat zamiast zaczynać nowy.
Panowie problem jest taki, że mój kod teoretycznie działa poprawnie, sprawdzałem różne możliwości i wyniki są poprawne. Próbowałem wielu dróg podejścia (tablice, operator modulo, działanie na intach). Sędzia jednak odrzuca mój kod. Czy ktoś mógłby podrzucić jakąś wskazówkę?
Krytyka kodu również mile widziana z uwagi na to, że jestem początkujący.
Mój kod [kiedyś tu był]

sprawdź wyniki dla następujących danych:

1
5 100000
1
1
1
1
1

z zasady ograniczam się do podania testu, dla którego wynik jest nieprawidłowy, ale skoro sam chcesz krytyki kodu :slight_smile:

1) nie stosujemy bez istotnego powodu typów double, float - tu są same liczby całkowite, wynik ma być także całkowity, więc takiego powodu nie ma

2) zmienne, o ile to konieczne zerujemy/podstawiamy na początku pętli, a nie na końcu - ciekaw jestem kto tak uczy, bo takie konstrukcje pojawiają się na forum nagminnie

3) zmienne globalne - ja się ich nie czepiam, sam stosuję - ale kolega narbej miałby o nie pretensje
(być może początkujący powinny je stosować z ostrożnością)

Bardzo dobrze, ale nie wystarczy sama chęć :wink:. Trzeba także przejrzeć ten i inne wątki.

Więc za mało sprawdzań?
Wszystkie drogi są dobre, ale zabrakło myślenia? W zadaniu zupełnie nie chodzi o to co [wydaje mi się] liczysz w swoim kodzie. Więc powinieneś, jeszcze raz przeczytać dokładnie treść zadania, i długo pomyśleć o co chodzi i jak to policzyć.

PS

  1. W ideone można i należy testować - wklejając testy do okienka stdin.
  2. np mzrób takie testy:
    1
    3 M
    8640
    8640
    8640
    za M podstawiając kolejno 1,2...do 31
    Ponieważ, nawet ręcznie widać, że za każdym razem, obżartuchy zjedzą zawsze 30 ciastek, możesz łatwo zweryfikować odpowiedzi twojego programu.

PS 2
Trudno i bezcelowe jest krytykowanie błędnego kodu, ale :slight_smile:

  1. Nieuzasadnione i do tego błędne zastosowanie i użycie zmiennych globalnych - skąd czerpiesz tajemną wiedzę na temat kopdowania?
  2. Nie ma potrzeby używania typu double, wystarczy typ int.
  3. Zmienne lokalne w c++ można deklarować wszędzie, więc najlepiej w tym wypadku:
    for (... tests....){ /// lub while(tests--){
    int ciastka = 0, pudełek = 0,....; //itd
    ....
    }
  4. zamiast tajemniczej 86400 czy nie lepiej 24*60*60 // kompilator policzy to w czasie kompllacji
  5. ..... bezcelowe jest dalsze krytykowanie błędnego kod :wink:
  • Tylko Long int w tym zadaniu się sprawdzi .

Dzięki za przydatne wskazówki :wink: kod został już zaakceptowany, faktycznie dopiero większa liczba testów pozwoliła mi stwierdzić, że moja wizja nie była poprawna.
Jeszcze krótko - dlaczego tak trzeba uważać na zmienne globalne?

*
* zajmują miejsce w pamięci przez cały czas działania programu
* jak piszesz kod to zazwyczaj używa się do tych samych konstrukcji jak for takich samych zmiennych "i" na przykład .
Teraz jak będziesz chciał użyć w pętli zmiennej globalnej to może się okazać że tejzmiennej jjuż przypisales wartość i nadpisujac ja program zacznie się dziwnie zachowywać .
* dla każdego bardziej skomplikowanego kodu praktycznie zawsze zabraknie krótkich nazw zmiennych - a wymyślanie nowych jest niepraktyczne bo już się jest przyzwyczajonym do pewnej konwencji . Jak spojrzysz na kod to od razu wiesz do czego dana zmienna jest uży a bo zawsze jej do tego używasz . Praktycznie idzie tak całe struktury tworzyć - taki kod jest później też bardziej czytelny .
* nie wiem jak sobie wyobrażasz kod z setka unikalnych nazw zmiennych .
* łatwiej też zastosować dla kodu ze zmiennymi lokalnymi metodę kopiuj w klej ( wiem że to zła praktyka - ale kto tego nie robi żeby zaoszczędzić czas )

Nie trzeba, wystarczy tylko [krótko :wink:]:

  1. starać się nie stosować :wink:
  2. mieć świadomość, że istnieją też zmienne lokalne
  3. dowiedzieć się [literatura] czym to [lokalne vs globalne] się różni.
  4. stosować świadomie - twój wybór.
  5. to, że w małych i prostych programach [np na SPOJ'a] nie ma różnicy, nie znaczy, że zmienne globalne są dobrą praktyką programistyczną - NIE nie są.
  6. SPOJ służy do uatrakcyjnienia nauki i utrwalania wiedzy informatycznej [algorytmicznej], ale mimo wielu zalet, ma też wady - np nie sprawdza "piękności" kodu - wystarczy "mu", że kod [nawet brzydki] daje poprawne odpowiedzi, na przygotowane testy.
  7. kod jest "czytany" nie tylko przez kompilator, który często potrafi "wypluć" bardziej czysty i optymalny program niż to się nawet śniło koderowi, ale także jest czytany przez człowieka, więc lepiej, by był ładny i czytelny.

Dwa fragmenty kodu w c++:

......
int i = 0;
int main()
{
    ...
    for (;;)
    { 
       cout << i << endl;
       ++i;
      if (i > 9) break;
  }
.....

int main(){
   ....
   for (int i = 0; i < 10; ++i)
        cout << i << endl;
......
// no comments

Ja nie potrafiłem odczytać tej twojej wizji z twojego kodu.
Większość zadań, można rozwiązać na wiele sposobów i dopiero teraz dostrzegłem inny [od mojej wersji] sposób - możliwe, że to była właśnie twoja wizja, której nie potrafiłeś poprawnie przekazać w swoim kodzie:

  1. obliczamy ile ciastek zje kolejny obżartuch.
  2. od tej ilości odejmujemy iość ciastek, które ewentualnie zostały w pudełku u poprzedniego obżartucha.
  3. obliczamy ilość pudełek, dla poprawionej ilości ciastek + ewentualną resztę ciastek w ostatnim pudełku
  4. dodajemy ilość pudełek do sumy
  5. if not last go to 1
  6. drukujemy obliczoną sumę pudełek

Jest to metoda bardziej "pracochłonna", ale i tak całą pracę wykonuje komputer [procesor].
Chyba łatwiej jednak jest wykorzystać jednego "zastępczego" obżartucha, który zjada wszystkie ciastka, i dopiero dla niego obliczyć potrzebną ilość pudełek.

PS
go to - użyłem tu tylko w psudokodzie :wink:, w normalnym kodzie należy użyć normalnej pętli.

Jeszcze raz dzięki za wskazówki. I co do mojej wizji - nic Ci nie ujmując to wydaje mi się, że rzeczywiście jej nie dostrzegłeś, bo to właśnie wskazówka od @mariusz193 pomogła mi poprawić kod.

Jeśli kogoś interesuje ja to zrobiłem tak:
1. Od liczby sekund w dobie odejmujemy kolejno w pętli czas jedzenia jednego ciastka przez obżartucha, a z każdą dekrementacją dodajemy 1 do licznika ciastek aż pozostały czas będzie mniejszy niż czas jedzenia ciastka;
2. Robimy tak z każdym obżartuchem sumując potem CAŁOŚĆ, a więc ich wszystkie zjedzone ciastka
3. Sumę dzielimy całkowicie przez liczbę ciastek w pudełku i wychodzi nam liczba potrzebnych pudełek
4. Sprawdzamy czy jest reszta - jeżeli tak, dodajemy 1 do liczby pudełek
5. Jeżeli ta reszta jest większa niż liczba ciastek w jednym pudełku (co w zasadzie nie powinno się zdarzyć, nie wiem czemu to uwzględniłem) to jeszcze raz dodajemy 1 do liczby pudełek.

I tyle. Wcześniejsza wizja była błędna ponieważ liczyłem pudełka dla każdego obżartucha osobno. Oczywiście pomijając błędy w kodzie co mogło pogarszać jego czytelność. Tak więc rzeczywiście jak mówisz to zadanie (jak pewnie wiele tutaj) można rozwiązać na kilka sposobów.

I to jest taki moment, gdy zaczynam się zastanawiać, czy ma to jakikolwiek sens, wkładania jakiegokolwiek większego wysiłku w "nadmierne" pomaganie początkującym?
Nic Ci nie ujmując, odnoszę wrażenie, że nie do końca zrozumiałeś [moich] podpowiedzi.
Więc może nie warto się wychylać i wystarczy tylko poczekać trochę dłużej, aż ktoś inny, [lepiej?] odpowie pytającemu? Miałem to "nieszczęście", że pisałem w tym samym czasie, co @mariusz193, a wystarczyło z podpowiedzią, poczekać trochę dłużej, a ewentualnie [mimo prośby pytającego] ograniczyć się tytlko do tego, co określa on [@mariusz193] jako zasadę?
W takim razie, wybacz, że niepotrzebnie zamąciłem Ci w głowie, i postaram się od teraz lepiej stosować do tej jednej prostej zasady.

programować każdy może :slight_smile: (co widać po poziomie prezentowanych rozwiązań zadań)

i co więcej, prawie wszyscy są przekonani, że to potrafią, a jedynie przez złośliwość sędziego nie zalicza im rozwiązań

ja zaś nie mam ani ambicji, ani ochoty uczyć kogokolwiek czegokolwiek - co powinni zrozumieć wszyscy mający nauczycielkę za żonę :slight_smile:

trochę lepiej lub trochę gorzej...., a po otrzymaniu AC, co niektórzy natychmiast myślą, że [lepiej] i że kogokolwiek interesuje ich [dziwny] sposób uzyskania go [AC].
Chyba, że znowu nie dostrzegam wizji. A [może?] wizja ta, to niewykorzystane moce CPU-SPOJA, ktore trzeba koniecznie spożytkować na dodatkową i niepotrzebną pracę. I wizja ta jest czymś zupełnie innym, niż:

PS
Wizja przecież ta sama [jakby ktoś miał wątpliwości], ale wykonanie już nie :wink:

PS 2

Mam tylo siostrę polonistkę [nie nauczycielkę], aktualnie zajmującą się w wolnym czasie redakcją techniczną [korekta] różnych wydawnictw [nie związanych z IT], na szczęście teraz już chroni mnie bariera czasoprzestrzeni, więc tylko mogę sobie wyobrazić twoją sytuację :wink:

Widocznie kilkoma źle zrozumianymi słowami spowodowałem zagęszczenie atmosfery. W każdym razie jeszcze raz dzięki za pomoc i życzę dalszych sukcesów;)

Witam wszystkich, podpinam się pod temat. Rozwiązałem to zadanie poprawnie wysyłając ten kod:

#include <iostream>

using namespace std;

int n, m, ile;
double ile_pudelek2=0;
int suma=0, ile_pudelek=0, ile_zje=0;
int czas[10000];
int main()
{
    cin>>ile;
    for(int i=1; i<=ile; i++)
    {
        cin>>n>>m;
        for(int j=1; j<=n; j++)
        {
            cin>>czas[j];
            ile_zje=86400/czas[j];
            suma+=ile_zje;
        }
    ile_pudelek=suma/m;
    ile_pudelek2=(double)suma/m;
    if( ile_pudelek2 > ile_pudelek)
    cout<<ile_pudelek+1<<endl;
    else
    cout<<ile_pudelek<<endl;
    ile_pudelek=0;
    ile_pudelek2=0;
    suma=0;
    }


    return 0;
}

Jednak nie podobało mi się w moim kodzie to, że za każdym razem tworzy się tak duża tablica mimo, że nie jest to potrzebne i wprowadziłem do mojego kodu następującą zmianę:

#include <iostream>

using namespace std;

int n, m, ile;
double ile_pudelek2=0;
int suma=0, ile_pudelek=0, ile_zje=0;
int main()
{
    cin>>ile;
    for(int i=1; i<=ile; i++)
    {
        cin>>n>>m;

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

        for(int j=1; j<=n; j++)
        {
            cin>>czas[j];
            ile_zje=86400/czas[j];
            suma+=ile_zje;
        }

        delete [] czas;

        ile_pudelek=suma/m;
        ile_pudelek2=(double)suma/m;
        if( ile_pudelek2 > ile_pudelek)
        cout<<ile_pudelek+1<<endl;
        else
        cout<<ile_pudelek<<endl;
        ile_pudelek=0;
        ile_pudelek2=0;
        suma=0;
    }


    return 0;
}

Po tej zmianie dostaje komunikat o błędzie wykonania. Niestety nie mam pojęcia co jest nie tak i zwracam się z pytaniem do was. Błąd jest pewnie trywialny, ale moje oko osoby uczącej się programować nie wychwytuje go :confused:

Pozdrawiam

hej, zrobiłem trochę testów swojego kodu i dla moich zestawów danych działał ok, niestety(w sumie to bardziej stety :wink:) sędzia znajduje jakiś błąd, jakby ktoś był w stanie przejrzeć mój kod i znaleźć błędy to byłbym mega wdzięczny. Wybaczcie ogólnie słabą jakość kodu ale wracam do programowania po dłuuuugim czasie i dopiero przypominam sobie jak to wszystko ma wyglądać:

http://ideone.com/cSuqRL7

sprawdź w podręczniku C++ jakie elementy tablicy czas istnieją w wyniku realizacji (fragmentu) kodu:

cin >> n;
czas = new int [n];

ta sama uwaga co powyżej

a tak w ogóle, to po co wam te tablice ? - żeby program wyglądał ładniej ? bardziej profesjonalnie ? czy jakikolwiek inny niezrozumiały dla mnie powód ?

i jaki jest powód użycia float/double w programie, gdzie wystarczają operacje na int