Testując z klawiatury [w okienku konsoli], nie widać pewnych niuansów [może widać, ale trezba umieć zauważyć].
Dlatego najlepiej testować przekierowywując z pliku, jak nie wiesz jak, możesz łatwo na ideone.com: zobacz http://ideone.com/cDDVGd122
Druga sprawa, to twój algorytm jest nie tylko mniej efektywny od najlepszego to dodatkowo błędny. Wystarczyłoby "ubrać" go w pętle dopóki a!=b. Po obu poprawkach jest AC 15 pkt.
PS
nwd (1122, 867) = 51 <-- https://pl.wikipedia.org/wiki/Algorytm_Euklidesa82
PS 2
To nie jest komunukat kompilacji, tylko komunikat sędziego - przy wykonaniu - sprawdzaniu poprawności działania twojego kodu.
PS 3
Kiedyś, "duży" test, mogł powodować TLE i tylko 10 pkt, ale po "przeprowadzce" na szybsze komputery, i pozostawieniu nie zmienionego limitu czasu [1 sek], nawet "wolne" ale poprawne algorytmy uzyskują 15 pkt.
Zmieniłem trochę algorytm, i przechodzi wszystkie testy - łącznie z przypadkami takimi jak: a=1122 i b=867 oraz a=1000000 i b=2.
Czas maksymalny wykonania programu narzucony w treści zadania to 1s. Mój algorytrm nie przekracza tego czasu.
Chyba najważniejsze jest to, że algorytm zwraca poprawne wyniki w zadanym czasie, prawda? Nawet jeżeli nie jest to najefektywniejszy sposób. Chyba, że nie ogarniam czegoś w działaniu sędziego...
Z jakiegoś powodu ideone pokazuje "błąd wykonania": http://ideone.com/tubyłlink92
Proszę kogoś o wytłumaczenie mi tego, jeśli w pośpiechu przedświątecznym znajdzie czas.
Kod:
Tu był kod.
Trochę przekombinowałeś. Można to zrobić dużo prościej. Na początku, byś mógł jakoś poukładać swój kod zastanów się jaki jest warunek końcowy programu? Skoro:
Gra kończy się w sytuacji, gdy żaden z graczy nie może wykonać ruchu (w szczególności gra może skończyć się bezpośrednio po "rozdaniu" żetonów, bez jakichkolwiek ruchów).
Oznacza to, że program ma wykonywać dana pętlę dopóki a != b
Czyli:
while (a!=b) {
//jakieś operacje
}
Nie mogę znaleźć testu, dla którego twój algorytm daje niepoprawny wynik, ale poukładaj to jakoś inaczej i czytelniej, żeby każdy mógł wiedzieć co robisz:
Na koniec:
while(a!=b){
if (a < b) {...}
else if (b < a) {...}
}
Właśnie tym drobnym niuansem w twoim kodzie był między innymi brak endl. Podpowiedzi także trzeba umieć czytać i z nich korzystać
Przepraszam. Wszyscy [większość] znających się na programowaniu i na "obsłudze" SPOJ'a, mogących Ci pomóc, będzie do jutra, do godziny 20:00, bardzo zajęta na ostatniej już w tym roku rundzie AlgoLigi -> http://algoliga.pl15. Ale nie czekaj, sam/a też możesz tam zajrzeć i spróbować swoich sił, zapraszamy Cię bardzo serdecznie!
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int a,b;
cin>>a>>b;
int x=0;
do
{
if(a>b)
{
a=a-b;
x=a+b;
}
else if(a<b)
{
b=b-a;
x=a+b;
}
else
{
x=a+b;
}
cout<<x<<endl;
}
while(a!=b);
}
return 0;
}
Dlaczego w tym kodzie pojawia się komunikat 0 (threshold: 5) ?
[->] Pamiętaj, że pętla:
do{
} while(...);
Wykonuje się przynajmniej raz i zamiast 3 out'ów w twoim programie są 4. Gra może się zakończyć od razu przy wartościach: [1, 1]; [2, 2]; [3, 3]; itd.
Tutaj masz pierwszą czynność do wykonania.
[->] Gdy poprawisz na taki kod :
po częsci poprawiony twój kod, ale nadal bez AC[CLICK]73
To nadal nie będzie AC. Po co Ci dodatkowa zmienna 'x' ? Nie lepiej od razu dodawać do 'a', odejmować od 'a' itd.?
a+= jakieś_wyrażenie;
lub
a-= jakieś_wyrażenie;
Po co na wyjście wypisujesz:
cout << x << endl;
?
Można od razu wypisać:
cout << a + b << endl;
Tylko musisz umieścić umieścić to cout ... po pętli while(a!=b){} , a nie w środku tej pętli. Podejrzewam, że po tych poprawkach będziesz mieć AC z wynikiem 10.
Max jest 15, ale to już sam musisz się domyśleć co zrobić, by mieć taki rezultat
PS. Usuń zmienną x i jej nie używaj, bo jest niepotrzebna.
PS 2. Ostatni warunek else ... też jest niepotrzebny.
Witam,
rowniez mam problem z tym zadankiem, pojawia sie ten sam blad: "0: Treshold 5" - nie mam pojecia co on oznacza, po kliknieciu nie pojawiaja sie zadne zrozumiale dla mnie informacje, natomiast przy probie kompilacji na ideone pojawia sie znow "blad wykonania" - czy to oznacza jakis gruby blad w kodzie?
tu jest link do mojego programu:
//TU BYL KOD
podejrzewam ze glownym problemem jest wydajnosc skryptu bo przy podaniu danych wejsciowych w stylu 1 000 000 000 i 1 czas wykonania programu wynosi kilkanascie sekund. czy moglbym liczyc na jakies podpowiedzi, jak to obejsc?
Banalna poprawka i będzie AC. Umieść linijkę
int A[t], B[t], wynik[t];
za:
cin >> t;
I dostaniesz AC z wynikiem 15. Widzę, że jesteś początkujący zatem kilka uwag.
Deklarowanie zmiennych w ten sposób:
cin >> t;
int A[t], B[t], wynik[t];
możliwe jest tylko w niektórych kompilatorach lub występuje jako rozszerzenie do niego. Należy unikać tego rodzaju deklaracji. Brzydki, ale przenośny kod wyglądałby tak:
cin >> t;
int *a, *b, *wynik;
a = new int[t];
b= new int[t];
wynik = new int[t];
Kod którego powinieneś użyć:
cin >> t;
std::vector a(t), b(t), wynik(t);
Odsyłam tutaj35
rzeczywiscie, wszystko jak powiedziales : )
fakt ze jestem poczatkujacy, dopiero czytam o podstawach, niestety brakuje mi dobrych kursow z przykladami praktycznymi, a w moim przypadku inny rodzaj nauki nie przynosi rezultatow, dlatego tez duzo eksperymentuje, jednak dzieki ludziom Twojego pokroju nawet na blednych eksperymentach mozna sie sporo nauczyc, dzieki wielkie za pomoc!!!
Halko sorki ,że odświeżam ale czy ktoś ogarnie czemu to nie chce działać ? #include
using namespace std;
int Lb_testow,zetonyA,zetonyB;
int main()
{
cout << “Podaj liczbe testow” << endl;
cin>>Lb_testow;
for (int i=1;i<=Lb_testow;i++)
{
cin>>zetonyA>>zetonyB;
{
while(zetonyA!=zetonyB)
{
if(zetonyA>zetonyB)
{
zetonyA = zetonyA-zetonyB;
}
if(zetonyA<zetonyB)
{
zetonyB = zetonyB-zetonyA;
}
}
}
cout<<zetonyA+zetonyB;
}
return 0;
}
Hej, sam zrobiłem kod, przeczytałem później cały temat i dalej nie wiem w czym leży błąd.
Obecnie 2 z testów są zaliczone poprawnie
Pierwsze testy trwają 0.01 s, niestety pokazuje mi iż ostatni test trwa 1.01s podczas gdy limit to 1.00s
int main()
{
int ile, a, b;
cin >> ile;
for (int i = 0 ; i < ile ; i++)
{
cin >> a >> b;
while (a!=b)
{
if (b > a)
{
b -= a;
continue;
}
else if (a > b)
{
a -= b;
continue;
}
}
cout << a + b << endl;
}
return 0;
}
Nie trwa, lecz zostaje zatrzymany gdy nie “wyrabia” się w ciągu 1 sekundy. Zostaje zatrzymany nie w 1.00 - tylko 0.01 sekundy później, czyli w 1.01 sekundzie, gdy sędzia już nie może doczekać się na jakikolwiek wynik [i stracił cierpliwość ]
PS
Do 13.05.2022 jestem w Siedlcach i wieczorami mam trochę czasu, a w niedzielę będę miał dużo więcej.
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 191 | Feb 1 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 154 | Apr 2 |
SPOJ.com - Problem ZABAWA pl.spoj.com | Zbiór zadań | 6 | 135 | Jun 23 |