@fulse dzięki za podpowiedź, rzeczywiście to nie ma sensu, bo dla kwadratu działa, ale po zrobieniu tej korekty dalej daje błędną odpowiedź…
in
1
6127 6127
out
557
@konradmal
Uwaga na liczby pierwsze oraz na szukanie dzielnika w taki sposób:
i = 2;
while( a % i != 0 )
i++;
Parę ciekawszych testów (wyniki różne od 1
) do kontroli
In
32
530 795
539 847
442 425
667 828
980 360
716 358
624 768
740 200
665 490
341 713
186 589
684 804
693 396
803 803
38 874
350 854
182 468
525 945
468 576
343 735
104 663
13 962
145 174
960 840
714 483
325 117
627 304
507 247
803 803
570 228
506 836
112 784
Mój out:
265
77
17
23
20
358
48
20
35
31
31
12
99
73
38
14
26
105
36
49
13
13
29
120
21
13
19
13
73
114
22
112
Witam,
mam problem z zadaniem MWP3_1C1 - Działka. Mój kod zwarca poprawne wartości, ale sędzia nie chce tego zaakceptować. Stosowałem rózne wskazówki do tego kodu, które znalazłem w internecie lub na tym forum, jednakże sędzia dalej jest nieugięty. Miałbym prośbę, o w miarę możliwości przejrzenie mojego kodu.
Pozdrawiam
Tomasz
Napisałem program, ale od dłuższego czasu nie jestem w stanie go skutecznie zoptymalizować - sędzia zgłasza przekroczenie limitu czasu.
Oczywiście zapoznałem się z postami wyżej, np.
tak jak w powyższym cytacie nie szukam NWD za pomocą Brute Force, a staram się mój ,counter" maksymalnie ,zniżyć" za pomocą warunków (wszystko widoczne jest w kodzie).
Dodatkowo, do testowania programu użyłem ok. 350 zestawów danych - wygenerowanych w Excelu (w tym zestwy z powyżej), co w mojej opinii jest wystarczające do przetestowania.
Mój kod załączam tu:
https://pastebin.com/RvJm9SGJ9
Poproszę o wskazówkę
Dziękuję
Pierwsza sprawa:
Po co w ogóle Ci tablica? Załóżmy, że masz do napisania program co wyznacza sumę liczb podanych na wejściu (na początku jeszcze liczba zestawów).
Twój program by wyglądał:
...
cin >> data;
for (int i = 0; i < data; ++i) {
cin >> tablica[i][0] >> tablica[i][1];
}
for (int i = 0; i < data; ++i) {
cout << tablica[i][0] + tablica[i][1];
}
Podczas gdy powinien wyglądać tak:
...
cin >> data;
for (int i = 0; i < data; ++i) {
cin >> a >> b;
cout << a + b;
}
Inaczej mówiąc: nie tabelaryzuj tych danych tylko po to by po nich przejsć. Po prostu operuj na nich przy wczytywaniu.
Druga sprawa:
W twoim kodzie jest: jeśli A==B to weź max(A,B)/2. Po co ten max skoro są równe?
Trzecia sprawa:
Czy na pewno chcąc sprawdzić czy liczba się przez coś dzieli musisz brać counter liczący (w dół) od mniejszej z nich? Wydaje mi się (nie wydaje mi się, tak z grzeczności piszę), że można sprawdzić o wiele mniejszy zbiór kolejnych dzielników.
Czwarta sprawa:
Masz jakiś błąd wykonania:
błąd7
Same odpowiedzi wyglądają poprawnie.
Dziękuję za odpowiedź!
Poprawiłem następujące punkty: 1, 2 i 4.
Co do trzeciej sprawy - niekiedy (szczególności dla małych wartości <20) zachodzi własność, że wynik A%B często jest równy dugości boku kwadratu. Ale problem jest już znaczący przy liczbach >10^5, gdy przykładowo A%B = 1456, a bok kwadratu wyniesie np. 5. Wówczas algorytm musi ,piłować " w dół do 5. Z kolei stosując algorytm liczący ,w górę" będzie musiał przejść cały przedział, by odnaleźć maksymalnie duży kwadrat (chodzi mi o to, że znajdzie kwadrat dla 1, 5, 7, … ale i tak będzie musiał liczyć, aż do A%B, by sprawdzić, że np dla 1000 nie zachodzi optymalniejszy warunek).
W każdym razie dziękuję i będę dalej próbować. Skoncentruję się by ten zakres jeszcze bardziej zawężyć.
Ciekawe jest Twoje podejście (w sensie rozkmina zadania). Tak, są takie przypadki, ale stwierdzenie, że trzeba będzie sprawdzić cały zakres <0,1175>
jest nieprawdziwe. Dla przypadku 37600 36425 kilkoma obliczeniami da się dojść do wartości 1175, a gdyby warunek sprawiający “korzystność” tego przypadku nie występował to i tak bym sprawdził zaledwie <2,~200>
(nie znaczy, że wynik będzie w tym przedziale), ale to już wystarczająco się nagadałem. Teraz kombinuj.
Minęło kilka dni i w mojej ocenie zoptymalizowałem kod maksymalnie.
Tj. zastosowałem ulepszony alg. Euklidesa a nie klasyczny alg, a także rozpatrzyłem oddzielny przypadek dla kwadratu, by maksymalnie proces przyśpieszyć.
Tu jest mój kod:
Sędzia jest natomiast innego zdania i twierdzi, że kod nadal nie jest maksymalnie zoptymalizowany - przekroczono limit czasu. Czy mogę prosić kogoś o wskazówkę?
Z góry dziękuję!