Strona 1 z 1

dwa prostokąty

: 23 sie 2010, o 15:12
autor: lolwat
Zadanie zaczerpnięte z pl.spoj.pl(nie, jego rozwiązanie nie jest nic warte ;) ).

Dane są dwa prostokąty na płaszczyźnie. Czy drugi można tak ustawić, aby zmieścił się w pierwszym(nie stykając się z nim)?

Mamy dane długości boków obu prostokątów.



Uploaded with

W wyniku serii niefortunnych obliczeń wyszedł mi następujący wielomian:
\(\displaystyle{ (1+ \frac{a^{2}}{b^{2}} )e^{2} - 4ae + a^{2} + b^{2} - c^{2}}\)
Następnie wyliczam sobie e(a tym samym i e') i sprawdzam czy długość boku "c" drugiego prostokąta nie przekracza ram wyznaczonych przez Pitagorasa.

Gdzie popełniam błąd?

Z góry dziękuję za wszelkie przejawy zainteresowania tym problemem ;d.

dwa prostokąty

: 23 sie 2010, o 16:53
autor: Satirev
Słuszna koncepcja (z tym obliczaniem e i e') ale ten wielomian jest niepotrzebny. Ułóż sobie warunki, takie jak: porównywanie odpowiednich boków prostokątów, porównanie przekątnych prostokątów itp. aż dojdziesz do momentu w którym z twierdzenia pitagorasa obliczysz e i e'. Następnie obliczysz maksylaną przeciwprostokątna powstałą na bazie e i e', którą porównasz z bokiem c i to sio. Jeśli nie wyraziłem się klarownie i przejrzyście, to przepraszam. Ewentualnie mogę wkleić kod swojego programu.

dwa prostokąty

: 23 sie 2010, o 17:16
autor: lolwat
Wybacz, nie wspomniałem. Porównywanie boków trójkątów oczywiście zachodzi dużo wcześniej, dopiero później próbuję upchać drugi prostokąt po przekątnej ;).
Obliczenie maksymalnego możliwego boku c, w oparciu o e i e' to oczywiście już nie problem. Jedyny problem na jaki natrafiłem to obliczenie e(a tym samym i e') - staram się tu wykorzystać podobieństwo trójkątów - z tej idei narodził się wspomniany wielomian.
Niestety nie wiem jak inaczej policzyć e. Za wszelką pomoc(łącznie z fragmentami kodu) serdeczne Bóg zapłać ;).

dwa prostokąty

: 23 sie 2010, o 17:26
autor: Satirev
narysowałbym schematyczny rysunek ale mi się nie chce, więc wkleje fragment kodu, który mam nadzieję Ci się przyda:

Kod: Zaznacz cały

//tutaj główne warunki...
if (Y < B)
			//jeśli przekątna mniejszego prostokąta jest mniejsza od B
          cout<<"TAK"<<endl; 
        else
          if (Y > X)
           //jeśli przekątna mniejszego prostokąta jest większa od przekątnej większego prostokąta
            cout<<"NIE"<<endl;
          else//jesli nie jest większa
          {
            //przyprostokątna leżąca na boku A
			W=sqrt(Y*Y - B*B);
			//pierwsza przyprostokątna malutkiego trójkąta
			L = (A-W)/2;
			 //przyprostokątna leżąca na boku B
			Z = sqrt(Y*Y-A*A);
			//druga przyprostokątna malutkiego trójkąta
			K=(B-Z)/2;
			//przeciwprostokątna malutkiego trójkąta
            DMax = sqrt(L * L + K * K);
			
			/* jeśli dł. krótszego boku drugiego prostokąta jest większa, bądź równa przeciwprostokątnej malutkiego trójkąta */
            if (D >= DMax)
              cout<<"NIE"<<endl;
            else // jeśli jest mniejsza
              cout<<"TAK"<<endl;
          }
//tutaj zamykanie odpowiednich modułów i zwrócenie zera
Wybacz, że inne oznaczenia zmiennych.

dwa prostokąty

: 23 sie 2010, o 19:57
autor: lolwat
Początkowo przedstawiony kod nie działał dla mnie poprawnie(podejrzewałem "główne warunki"). Jak się okazało słusznie .
Do głównych warunków dodałem jeden którego nie miałem

Kod: Zaznacz cały

if((ldouble)a/b < (ldouble)c/d){
	std::cout<<"NIE"<<std::endl;
	continue;
}
I od razu zaakceptowany .

Dziękuję za pomoc i pozdrawiam!

dwa prostokąty

: 23 sie 2010, o 22:43
autor: Satirev
Nie ma za co. Huh, ja mam więcej "głównych" warunków Z czystej ciekawości jaki czas wykonywalny programu uzyskałeś?

dwa prostokąty

: 24 sie 2010, o 10:37
autor: lolwat
Głównych warunków oczywiście jest więcej . Podałem ten którego brakowało. Po oczyszczeniu kodu uzyskałem 0.04s.

dwa prostokąty

: 24 sie 2010, o 11:39
autor: Satirev
O ja...w takim wypadku chyba muszę poszukac informacji o skracaniu kodu, bo mój aktualny czas to wstyd