Hướng dẫn giải của Bedao Mini Contest 06 - PYRAMID
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Solution từ
Gọi ~a~ là độ dài cạnh góc vuông ngắn, ~b~ là độ dài cạnh góc vuông dài, ~c~ là độ dài cạnh huyền.
Theo đề bài, ta có:
~X = c - a~ hoặc ~X = c - b~ ~(1)~
~Y = a + b~ ~(2)~
Theo định lý Pytago và cố định ~1~ cạnh góc vuông để tìm cạnh góc vuông còn lại, ta có:
~\rightarrow a^2 + (Y-a)^2 = (X+a)^2~
~\rightarrow a^2 = (X+a)^2 - (Y-a)^2~
~\rightarrow a^2 = (X-Y+2a) \times (X+Y)~
~\rightarrow a^2 - 2a \times (X+Y) - X^2 + Y^2 = 0~
Từ đây ta thấy biểu thức có dạng là phương trình bậc ~2~, ta lại có:
~A = 1~, ~B = 2 \times (X+Y)~, ~C = -X^2 + Y^2~
~\rightarrow Δ = B^2 - 4AC~
~\rightarrow a_1 = \frac{-B+\sqrt{Δ}}{2A}, a_2 = \frac{-B-\sqrt{Δ}}{2A}~
Nhận xét: Ở ~2~ nghiệm ~a_1~ và ~a_2~ sẽ luôn có một nghiệm sai khi so với điều kiện ~(1)~, ~(2)~ và ~a~, ~b~, ~c~ phải lớn hơn ~0~ nên ta sẽ ưu tiên nhận nghiệm đúng và nhỏ hơn đối với ~a~ bởi vì đề bài yêu cầu ~a < b~.
~\rightarrow b = Y-a~
~\rightarrow c = a^2 + b^2~
Lưu ý: Khi ~a > b~ mà lấy ~c = X + min(a,b)~ thì khi xuất bộ ba ~a~, ~b~, ~c~ sẽ không thỏa mãn một tam giác vuông cho nên cần phải tính ~c = X + max(a,b)~ rồi mới cho ~a~ nhận nghiệm nhỏ hơn.
Solution được đóng góp từ bạn
Đặt ~a,b,c~ lần lượt là độ dài hai cạnh góc vuông và độ dài cạnh huyền của tam giác.
Theo đề bài, ta có :
~c - a = X \Leftrightarrow c = X + a~ ~(*)~
~a + b = Y \Leftrightarrow b = Y - a~
Theo định lý Pytago : ~c = \sqrt{a^2+b^2} = \sqrt{a^2+(Y - a)^2}~
Thay ~c~ vào ~(*)~ ta có
~\sqrt{a^2+(Y-a)^2} = X + a \\ \Leftrightarrow a^2 + (Y-a)^2 = (X+a)^2 \\ \Leftrightarrow (Y-a)^2 = X(X + 2a) \\ \Leftrightarrow a^2 - 2aX - 2aY = X^2 - Y^2 \\ \Leftrightarrow a^2 - 2a(X+Y) + (X+Y)^2 = (X+Y)2X \\ \Leftrightarrow (a - (X+Y))^2 = 2X(X+Y) \\ \Leftrightarrow a = (X+Y) \pm \sqrt{2X(X+Y)} ~
Vì ~a < Y~ nên ~a~ sẽ nhận nghiệm ~a = (X+Y) - \sqrt{2X(X+Y)}~
Từ đó ta sẽ tính được ~b,c~ tương ứng. Lưu ý in ra theo thứ tự ~min(a,b)~, ~max(a,b)~ như đề bài yêu cầu
Code mẫu
#include<bits/stdc++.h> #define ll long long #define nmax 100005 #define fas ios::sync_with_stdio(0); cout.tie(0); cin.tie(0) #define el "\n" #define fi first #define se second #define lb long double using namespace std; lb x, y, a, b, c; lb tim_nghiem(lb m, lb n, lb p) { lb delta = n*n-4.0*m*p; if(delta == 0) return -1.0*(n/2.0*m); else { lb n1 = ((-1.0*n)+sqrt(delta))/(2.0*m); lb n2 = ((-1.0*n)-sqrt(delta))/(2.0*m); if(y-n1 > 0) return n1; if(y-n2 > 0) return n2; } } int main() { //freopen("TRICALC.inp", "r", stdin); // freopen("TRICALC.out", "w", stdout); cin >> x >> y; lb e = x+y; lb f = (x*x-y*y); // cout << e << " " << f << endl; a = tim_nghiem(1.0, -2.0*e, -1.0*f); // cout << a << endl; b = y-a; c = x+a; lb eps = 1e-5; if (b-a < eps) swap(a,b); cout << fixed << setprecision(9) << a << " " << b << " " << c; }
Bình luận
Orz Quý