Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zadanie "Wesoła małpka"

Ostatnio zmodyfikowano 2014-12-02 20:10
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
[C++] Zadanie "Wesoła małpka"
» 2014-11-30 17:38:04
Rozwiązuję zadanie z MAIN2 pt."Wesoła małpka".

Treść zadania:
Wesoła małpka znalazła sobie nową zabawę. Ustawiła n klatek
ze zwierzątkami (w jednej klatce jest dokładnie jedno zwierzątko)
w kółeczko i skacze po nich. Małpka zawsze skacze od kolejnych
klatek i zawsze otwiera tę, na której stoi. Małpka zatrzyma się,
gdy skoczy na wcześniej otwartą klatkę. Twoim zadaniem jest
stwierdzić, ile zwierzątek ucieknie. Wiadomo, że wszystkie
klatki są początkowo zamknięte oraz każde zwierzątko (poza
wesołą małpką) korzysta z okazji ucieka jeśli może.

Wejście

Pierwszy wiersz wejścia zawiera jedną liczbę całkowitą z (1 ≤ z ≤ 1000000), oznaczającą liczbę zestawów danych. W następnych z wierszach opisywane są kolejne zestawy. Każdy wiersz zestawu zawiera po dwie liczby całkowite n i d(1 ≤ n, d ≤ 10^9) oddzielone spacją, oznaczające odpowiednio liczbę klatek oraz długość skoku małpki
(d = 1 oznacza, że małpka przeskoczy na następnąw kolejności klatkę).

Wyjście

Dla każdego zestawu danych powinna się znaleźć w nowym wierszu jedna liczba całkowita,
równa liczbie zwierzątek, które uciekną.

Mój kod:
C/C++
#include <iostream>
using namespace std;

int main() {
    int z, n, d;
    register int wypuszczone, krok;
    cin >> z;
    while( z-- > 0 ) {
        cin >> n >> d;
        bool przesuniecia[ d ];
        for( register int i = 0; i < d; ++i )
             przesuniecia[ i ] = true;
       
        wypuszczone = 0;
        krok = 0;
        do {
            wypuszczone +=( n + krok ) / d;
            przesuniecia[ krok ] = false;
            krok =( n + krok ) % d;
        } while( przesuniecia[ krok ] == true );
       
        cout << wypuszczone << '\n';
    }
    return 0;
}

Program działa bez zarzutu przy małych liczbach,
jednak przy dużych "zestawach danych" za długo pracuje,
tzn. przy sprawdzaniu przez system sprawdzający wyrzuca:
"Przekroczenie limitu czasu"... (o 50ms)

Jak ten program można zoptymalizować lub zmienić?

Zastanawiałem się czy można jakoś połączyć
modulo i dzielenie, lecz nic nie znalazłem...
P-121759
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-11-30 20:25:31
Pomożecie? :C
P-121771
mati1995g
» 2014-11-30 20:35:55
Wklej to do int main i powiedz czy pomogło
C/C++
ios_base::sync_with_stdio( 0 );

P-121774
darko202
» 2014-11-30 20:38:53
czy mógłbyś wyjasnić użyte pojecie
* "dużych zestawów danych"
jeśli bowiem rezerwujesz zbyt wielką ilość pamieci na zmienne tzn. więcej niż jest dostępnych zasobów sustemu


* zawiesza się - zwraca komunikat
bool przesuniecia[ d ]; po tej operacji czy na petli while

* jak rozumiesz optymalizację programu ?



P-121775
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-11-30 21:38:45
Wklej to do int main i powiedz czy pomogło
W niektórych przypadkach lepiej, a w niektórych gorzej. :/
Jednak nadal jest przekroczony limit czasu:

1d) 7.01s/7.00s(max)
1e) 7.07s/7.00s(max)
1f) 7.03s/7.00s(max)

"dużych zestawów danych"
jeśli bowiem rezerwujesz zbyt
wielką ilość pamieci na zmienne
Ten program ma przyjąć "z" zestawów danych.
Rozwiązałem to tak:
C/C++
cin >> z;
while( z-- > 0 ) {
    cin >> n >> d;
    //...

Błędnie to opisałem, bo chodzi mi
o wielkość liczb w zestawach.

Głównym problemem jest to że im większe
będzie "d" od "n" tym dłużej będzie
pracować przy danym zestawie, co nie
idzie na moją korzyść.

zawiesza się - zwraca komunikat
bool przesuniecia[ d ]; po tej operacji czy na petli while
"Program działa bez zarzutu"...

Wiem, że ten działanie jest złe, ale nie
znam się jeszcze na dynamicznej alokacji,
więc tak zostało z mojej "zieloności".

jak rozumiesz optymalizację programu ?
Zrobienie coś z nim by zwrócił on
prawidłowy wynik w krótszym czasie.
P-121788
Monika90
» 2014-12-01 00:04:23
C/C++
#include <iostream>
#include <boost/math/common_factor.hpp>

int main()
{
    int z;
    std::cin >> z;
    while( z > 0 )
    {
        int n, d;
        std::cin >> n >> d;
        std::cout << n / boost::math::gcd( n, d ) << '\n';
        --z;
    }
}

I to wcale nie jest gotowiec, bo MAIN nie ma boosta.
P-121804
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2014-12-01 15:44:52
n / boost::math::gcd( n, d )
,
Nie rozumiem tego. Co to robi?
P-121834
Monika90
» 2014-12-01 16:03:00
po angielsku GCD znaczy to samo co NWD po polsku
P-121835
« 1 » 2
  Strona 1 z 2 Następna strona