Hướng dẫn giải của Bedao Mini Contest 06 - PYRAMID


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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ừ bedao

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 letangphuquy

Đặ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

Hãy đọc nội quy trước khi bình luận.



  • -3
    NotKeobe  đã bình luận lúc 26, Tháng 12, 2022, 13:38

    Orz Quý