Hướng dẫn cho Tam giác không cân
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Authors:
Spoiler Alert
Hint 1
Tìm điều kiện tam giác và loại bỏ điều kiện để nó cân, từ đó suy ra kết quả
Hint 2
Điều kiện độ dài các cạnh: (a > 0) && (b > 0) && (c > 0)
Điều kiện để tạo tam giác: (a + b > c) && (b + c > a) && (c + a > b)
Điều kiện để tam giác cân: (a == b) || (b == c) || (c == a)
Hint 3
Điều kiện tam giác không cân: ((a > 0) && (b > 0) && (c > 0)) && ((a + b > c) && (b + c > a) && (c + a > b)) && !((a == b) || (b == c) || (c == a))
Reference AC code | \(O(1)\) time | \(O(1)\) auxiliary space | Math
C++
int main()
{
ll a, b, c;
cin >> a >> b >> c;
bool ok1 = (a > 0) && (b > 0) && (c > 0);
bool ok2 = (a + b > c) && (b + c > a) && (c + a > b);
bool ok3 = (a == b) || (b == c) || (c == a);
cout << ((ok1 && ok2 && !ok3) ? "YES" : "NO");
return 0;
}
Hint 4
Bạn cũng có thể sắp xếp các cạnh để có công thức toán học gọn hơn
Reference AC code | \(O(1)\) time | \(O(1)\) auxiliary space | Math
C++
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll med(ll a, ll b, ll c) { return max(min(a, b), min(c, max(a, b))); }
int main()
{
ll a, b, c;
cin >> a >> b >> c;
tie(a , b , c) = make_tuple( max(a, max(b, c)) , med(a, b, c) , min(a, min(b, c)) );
cout << ((a > b && b > c && c > 0 && b + c > a) ? "YES" : "NO");
return 0;
}
Reference AC code | \(O(1)\) time | \(O(1)\) auxiliary space | Math
C++
int main()
{
ll a, b, c;
cin >> a >> b >> c;
if (a < b) swap(a, b); if (a < c) swap(a, c); if (b < c) swap(b, c); /// sort 3 so
cout << ((a > b && b > c && c > 0 && b + c > a) ? "YES" : "NO");
return 0;
}
Bình luận
Có cách làm gọn hơn nữa, ta nhận thấy để thỏa mãn BĐT tam giác thì chỉ cần cạnh lớn nhất bé hơn tổng 2 cạnh còn lại là được (từ đây dễ dàng suy ra các BĐT khác) \n
Vì thế ta nhập độ dài 3 cạnh vào mảng a[3], sắp xếp a[0] <= a[1] <= a[2] \n
Điều kiện ok1 = a[0] > 0 \n
Điều kiện ok2 = a[0] + a[1] > a[2] \n
Điều kiện ok3 = (a[0] != a[1]) and (a[1] != a[2]) \n
Điều kiện \((a>0)\&\&(b>0)\&\&(c>0)\) này không cần vì \((a>0)\&\&(b>0)\&\&(c>0)\) đã bao trùm lên nó