Kilka rzeczy:
1 - jak sprawdzasz czy da się zbudować trójkąt z 3 patyków, to wystarczy, że 2 najmniejsze są większe od trzeciego, bo jak dwa najmniejsze są większe, to inne które są większe od tych największych tym bardziej dadzą wiekszą sumę. Funkcja sprawdzająca może wyglądać tak:
bool sprawdz(Liczba &a, Liczba &b, Liczba &c) {
Liczba ApB = {a.lic * b.mia + b.lic * a.mia, a.mia * b.mia}; // a + b
if (ApB.lic * c.mia > c.lic * ApB.mia) // a + b > c
return 1;
return 0;
}
Po drugie, jak sortujesz tablicę i sztywno definiujesz jej rozmiar, to prosisz się o kłopoty. Lepiej wrzuć sobie na vector, posortuj jak Bóg przykazał i problemy znikły.
Te 2 rzeczy opisane powyżej do dobre praktyki, które warto pisać, żeby nie prosić się o kłopoty.
I teraz skupmy się na twoim operatorze. Zauważ, że ty w nim napisałeś warunek, żeby sortował od największych.
return (b.lic * mia >= lic * b.mia);
A jak sprawdzasz czy da się zbudować trójkąt, to sprawdzasz najmniejszy, drugi najmniejszy i największy. A ty do funkcji przekazujesz 1,2,N, czyli największy, drugi największy i najmniejszy, co już z założenia jest złe. (Przy założeniu, że usuwamy z funkcji te 2 if-y i zostawiamy nową wersję, tylko A+B > C)
I teraz apropo twojego operatora:
bool operator < (Liczba &b) {
return (b.lic * mia >= lic * b.mia);
}
Ja jakoś bardzo na składni operatorów w C++ się nie znam, więc nie wiem czy ten twój jest poprawny(są na forum napewno osoby, które się znają, więc one mogą się wypowiedzieć), ale jak zmieniłem na taki jak ja piszę, to przeszło na 100, więc raczej jest zły. Ogólnie jak zaczynałem uczyć się programować i algorytmiki, to przyjąłem stałą konwencję pisania operatorów i przy ponad 400 zadaniach się na niej nie zawiodłem(pisząc tą konwensją) , więc podejrzewam, że jest dobra (Prosiłbym o potwierdzenie osoby znającej się z składnią C++). Zakładam, że sortuję od najmniejszych, żeby sprawdzić w procedurze patyczki o numerach 1,2,N.
Mniej więcej schemat jak piszę operator wygląda tak:
bool operator < (const Liczba &liczba) const
{
return (lic * liczba.mia < liczba.lic * mia);
}
- są 2 consty ten drugi chyba jest obowiązkowy, nie piszę &b, tylko &liczba, w sensie nazwa structa tylko z małej
- zawsze jako pierwszą w porównywaniu porównuję licz, a nie liczba.licz
- unikam <=, >= itp, tylko piszę <, > itp. (jesli to mozliwe)
w twoim operatorze nie ma constów, co wydaje mi się, byc błedne, i też co jest podejrzane, to że najpierw sprawdzasz b.lic, a nie lic.
Myśłę, że błędem w twoim kodzie mogło być to sortowanie z stałym rozmiarem tablicy o jeden większym, w sensie ten element nie używany gubił porządek, dlatego jest to proszenie o problemy i lepiej zrobić to normalnie na vectorze. Sprawdziłem i po poprawieniu tego przechodzi na 100.