SPOJ - Przekroczenie limitu czasu

SPOJ - Przekroczenie limitu czasu
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

Witajcie !
Ćwiczę sobie na tym SPOJu i mam zagwoztkę. Obecnie robię zadanie: http://pl.spoj.com/problems/EUCGAME/ .
Mój kod wygląda tak:

Kopiuj
#include <iostream>
using namespace std;

bool f_EndRound(int a, int b){
    return (a == 0 || b == 0 || a == b);
}
int f_StartRound(int a, int b){
    while(!f_EndRound(a, b))
    {
        if(a > b)
         a -= b;
        else
        if(b > a)
         b -= a;
    }
    return a+b;
}
int main()
{
    int t;
    for(cin>>t; t>0; --t)
    {
        int a, b;
        cin >> a >> b;
        cout << f_StartRound(a, b) << endl;
    }
    return 0;
}

Niestety dla 1 z 3 przypadków przekraczam czas wykonania 1.01s/1s. Próbowałem funkcje f_EndRound() wepchnąć bezpośrednio do pętli while, bez zmian. Macie pomysł?

Kopiuj
#include <iostream>
using namespace std;

int f_StartRound(int a, int b){
    while(a != 0 && b != 0 && a != b)
    {
        if(a > b)
         a -= b;
        else
        if(b > a)
         b -= a;
    }
    return a+b;
}
int main()
{
    int t;
    for(cin>>t; t>0; --t)
    {
        int a, b;
        cin >> a >> b;
        cout << f_StartRound(a, b) << endl;
    }
    return 0;
}
 
edytowany 1x, ostatnio: gswidwa
Zobacz pozostały 1 komentarz
gswidwa
A ja myślę, czemu mi pokazuje jako błąd, będę pamiętać :D
gswidwa
Wiem, doczytałem się w artykule kolegi wyżej :) "zagwoździć" ;P
_13th_Dragon
Bo jak będzie a=1 zaś b=1000000000 to musisz wykonać mln odejmowań zamiast jednego modulo.
bogdans
@gswidwa, przedtem użyłeś zapisu fonetycznego (choć niepoprawnego), teraz użyłeś zapisu, który nie jest ani poprawny, ani fonetyczny. To nie była "dobra zmiana".
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:6 dni
1
Kopiuj
#include <cstdio>
using namespace std;

unsigned nwd(unsigned a,unsigned b)
  {
   while(b)
     {
      unsigned r=a%b;
      a=b;
      b=r;
     } 
   return a; 
  }

int main()
  {
   unsigned T,A,B;
   for(scanf("%u",&T);T--;printf("%u\n",nwd(A,B)<<1)) scanf("%u%u",&A,&B);
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

Miałeś rację, dodałem tylko

Kopiuj
int f_StartRound(int a, int b){
    if((a == 1 && b > 1) || (a > 1 && b == 1))
     return 2; 

i po sprawie, dziękować ! Problem w tym, że powinienem sam wyłapywać takie możliwości a nie lecieć na forum jak leniwy student informatyki (nie jestem studentem)

fasadin
powinienes poczytac o roznicu w uzywaniu cout a printf http://4programmers.net/C/Wymuszanie_wysokiej_wydajno%C5%9Bci_iostream
gswidwa
k, czytam. (nie słyszałem o tym nigdy)
gswidwa
Przetestowałem to, i dodanie tego spowolniło mi wręcz wykonanie o 0.05s. Hmm...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.