Zadanie Obżartuchy Błędna odpowiedź

0
#include <iostream>

int main()
{

    using namespace std;

    unsigned int testy;
    unsigned int N;
    unsigned long long M;
    unsigned int obzartuch;
    unsigned int total{ 0 };
    long ciastka;
    long double pudelka{ 0 };
    long int d;
    cin >> testy;
    int* w = new int[testy];
    for (int licznik{ 0 }; licznik < testy; licznik++) {
        w[licznik] = 0;
        cin >> N >> M;
        if (N >= 1 && N <= 1000 && M >= 1 && M <= 1000000000) {
            for (int i{ 0 }; i < N; i++) {
                cin >> obzartuch;
                if (obzartuch < 100000) {
                    ciastka = 86400 / obzartuch;
                    pudelka += (ciastka + 0.0) / (M + 0.0);
                }
            }
            d = pudelka;
            if (pudelka - d == 0 || pudelka - d == 0.0) {
                w[licznik] = pudelka;
            }
            else {
                w[licznik] = pudelka + 1.0;
            }
        }
        pudelka = 0;
    }
    for (int licznik{ 0 }; licznik < testy; licznik++)
        cout << w[licznik] << endl;
    delete w;
    return 0;
}

Cześć. Zrobiłem zadanie z spoja. Robiłem je 2 godziny. Moje pytanie: dlaczego wywala mi błędną odpowiedź? Czy ten program da się jeszcze skrócić i zoptymalizować ? Jestem świadom, że użycie new jest złe. Jednak wszystko po kolei. Do obiektów dojdę za kilka dni. Przerabiam Prate

2
  1. Następnym razem stosuj się do Dlaczego nikt nie odpowiada w moim wątku?
  2. Popraw formatowanie, jest fatalne (dobra, zrobiłem to za Ciebie, tag <cod​e> też dodałem)
  3. Dlaczego nie policzysz pierw sumarycznej liczby ciastek a dopiero potem sprawdzisz ile to jest pudełek? Bawienie się liczbami zmiennoprzecinkowymi często kończy się samookaleczeniem.
  4. Nie używaj new i delete, to antyidiomy w C++. (przy okazji, masz UB bo masz delete sparowane z new[])
0

Moje rozwiązanie (zaakceptowane) zajmuje 11 linijek kodu i 4 zmienne i nie ma ani jednej tablicy. IMHO się da.

0

A warunki?

1

A warunki też są złe, w/g zadania N może być z zakresu 1 ≤ N ≤ 10.000 a nie 1 ≤ N ≤ 1.000

0

Już poprawiłem. Z tym co radzileś czyli sumaryczna liczbą. Zlikwidowalem jedną niepotrzebną zmienną i zmieniłem typ zmiennych. Przyjelo mi. Jak to możliwe, że tylko 11?

1

Po prostu nie potrzeba tylu zmiennych i tak zwariowanych warunków.

A, używaj assert zamiast ifów po cichu robiących bigos na wejściu. Jak masz sztywne warunki wejścia, to jedyną poprawną reakcją programu na niewłaściwe dane to wywrotka a nie praca na totalnie walniętych danych, których raczyłeś nie wczytać do końca poprzez ominięcie ifem.

0

Poprawiłem jeszcze raz zadanie. Usunąłem warunki itd. Cały program ma teraz 29 linijek. Nie rozumiem dlaczego spoj daje warunki do zmiennych, że np musi być mniejsza lub równa 10000 jak zadanie przechodzi bez tych warunków

2

Tam jest napisane, że takie wartości (z takiego przedziału) mogą zostać wygenerowane przez spoj, a nie, że masz sprawdzać czy są w tym przedziale- bo zawsze są.

1

Nie rozumiem dlaczego spoj daje warunki do zmiennych, że np musi być mniejsza lub równa 10000 jak zadanie przechodzi bez tych warunków

Te warunki mają Ci ułatwić czasami rozwiązanie (np. istnieje dla nich jakichś wzór, twierdzenie, cokolwiek). Ale dobrą praktyką jest wrzucenie asercji - ja miałem kilka przypadków, że w moich własnych przypadkach testowych porobiłem błędy i asercje pozwoliły łatwo to odsiać.

0
#include <iostream>

int main () {
    using namespace std;

    int test, n,czas, ciastka{0}, wynik;
    float m;
    cin >> test;
    for(int licznik{0}; licznik < test; licznik++) {
            cin >> n >> m;
            for(int licznik1{0}; licznik1 < n; licznik1++) {
                cin >> czas;
                ciastka += 86400/czas;
            }
            wynik =ciastka/m;
            if(ciastka/m - wynik != 0.0)
                wynik += 1;
            cout << wynik << endl;
            ciastka = 0;
    }
    return 0;
}

Mój kod ma 3.4M. Niektórych ma 2.4M też w c++. Da się jeszcze uprościć ten kod?

1

Mój program w C zajmuje ok. 2 MB, więc to raczej kwestia rozmiaru bibliotek danego języka. Pewnie zmiana kompilatora mogłaby pomóc. Żeby to uprościć: po co "m" u Ciebie jest typu float? Może ten fragment to jedna linijka:

            wynik =ciastka/m;
            if(ciastka/m - wynik != 0.0)
                wynik += 1;

W dodatku niewymagająca float :)?

0

Można by z ceil-a skorzystać, aczkolwiek przy tak małym zużyciu pamięci najwięcej zależy chyba od kompilatora i jego wersji

1 użytkowników online, w tym zalogowanych: 0, gości: 1