Hướng dẫn giải của Kiểm tra tam giác hợp lệ


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.

Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.

Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.

Bạn phải đăng nhập để mở lời giải này.

Đăng nhập

Tác giả: Hiếu Nguyễn, huiphom315, peterjerry, Dinone369

Hiểu bài toán

Bài toán yêu cầu kiểm tra ba số nguyên dương a, b, c nhập vào có thể là ba cạnh của một tam giác hợp lệ hay không.

  • Điều kiện để ba cạnh tạo thành tam giác là tổng của hai cạnh bất kỳ phải lớn hơn cạnh còn lại (a + b > c, a + c > b, b + c > a).
  • Nếu không thỏa mãn, in ra 'NO'.
  • Nếu thỏa mãn, tính và in ra chu vi (tổng ba cạnh) và diện tích tam giác.
  • Diện tích được tính theo công thức Heron: S = √[p(p - a)(p - b)(p - c)], với p là nửa chu vi (p = (a + b + c) / 2).
  • Kết quả diện tích được làm tròn đến hàng phần trăm (2 số lẻ sau dấu phẩy).

Các cách tiếp cận

Cách Phương pháp kiểm tra điều kiện tam giác và công thức Heron
#include <stdio.h>
#include <math.h>

int main(void) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    if (a+b > c && b+c > a && c+a > b){
        printf("%d\n", a+b+c);
        double p = (a+b+c)/2.0;
        printf("%.2lf", sqrt(p*(p-a)*(p-b)*(p-c)));
    }
    else printf("NO");
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Đây là cách tiếp cận trực tiếp và phổ biến nhất.

  1. Đọc ba số nguyên a, b, c.
  2. Kiểm tra điều kiện tam giác: (a + b > c) && (b + c > a) && (c + a > b). Nếu điều kiện này sai, in ra 'NO'.
  3. Nếu đúng, tính chu vi: a + b + c và in ra.
  4. Tính nửa chu vi p dưới dạng số thực bằng cách chia chu vi cho 2.0 để tránh sai số số nguyên.
  5. Tính diện tích sử dụng công thức Heron: sqrt(p * (p - a) * (p - b) * (p - c)).
  6. In kết quả diện tích với định dạng %.2lf để làm tròn đến 2 số lẻ.
  • Lưu ý: Các biến a, b, c mặc định là int (khoảng 2 tỷ) nên chu vi tối đa ~6 tỷ (vượt quá int). Tuy nhiên, trong giải pháp này, p được tính bằng số thực double nên có thể chứa giá trị lớn. Tuy nhiên, để đảm bảo an toàn cho các test case lớn (đến 10^8), nên dùng long long cho các biến số nguyên. Solution 1 dùng int nên có thể tràn số với giới hạn cao nhất (10^8), nhưng thường các bộ biên tập sẽ kiểm tra chặt chẽ, hoặc code này chỉ chạy đúng trên dữ liệu nhỏ. Solution 2 và 3 dùng long long hoặc unsigned long long là đúng đắn hơn.
Cách Cải thiện an toàn số nguyên (Sử dụng long long)
#include<stdio.h>
#include<math.h>
int main(){
    long long a, b,c ;
    scanf("%lld %lld %lld",&a ,&b , &c);
    if(a>0 && b>0 && c>0 && a+b>c && a+c>b && c+b>a ){
        long long chuvi= a + b + c;
        double P=chuvi/2.0;
        double dientich =sqrt(P*(P-a)*(P-b)*(P-c));
        printf("%lld ",chuvi);
        printf("%.2lf",dientich);
    }
    else{
        printf("NO");
    }
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Phương pháp này tương tự như phương pháp 1 nhưng tối ưu hóa về mặt kiểu dữ liệu để phù hợp với giới hạn đề bài (a, b, c lên tới 10^8). Nếu dùng int, tổng ba cạnh có thể lên tới 310^8, vẫn nằm trong giới hạn của int (210^9), nhưng nếu đề bài thay đổi giới hạn hoặc để code chắc chắn hơn, long long là lựa chọn an toàn.

  • Sử dụng long long cho a, b, c và biến chu vi.
  • Tính P = chuvi / 2.0 (số thực).
  • Tính diện tích và in kết quả.
  • Kiểm tra a>0, b>0, c>0 (dù đề bài nói số nguyên dương, nhưng kiểm tra thêm cũng không hại).
  • Đây là cách làm chuẩn chỉnh nhất cho bài toán này.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(1) O(1) Phương pháp kiểm tra điều kiện tam giác và công thức Heron
2 O(1) O(1) Cải thiện an toàn số nguyên (Sử dụng long long)

Bài học kinh nghiệm

  • Điều kiện tam giác là tổng hai cạnh lớn hơn cạnh còn lại. Nếu sắp xếp a <= b <= c, chỉ cần kiểm tra a + b > c.
  • Công thức Heron yêu cầu tính toán số thực. Phải đảm bảo phép chia diễn ra dưới dạng số thực (ví dụ chia cho 2.0 thay vì 2).
  • Để tránh tràn số nguyên khi tính toán trên các số lớn (ví dụ tích các số lớn trong công thức Heron), nên sử dụng số thực double cho các phép tính diện tích.

Lỗi thường gặp

  • Tràn số nguyên khi cộng ba cạnh nếu chỉ dùng int (dù trong giới hạn đề bài hiện tại thì int vẫn ổn, nhưng long long an toàn hơn).
  • Sai lệch kết quả do làm tròn sớm hoặc sai kiểu dữ liệu khi chia (chia 2 cho số nguyên sẽ cắt bỏ phần lẻ).
  • Thiếu kiểm tra điều kiện tam giác (ví dụ chỉ kiểm tra a+b>c mà quên các trường hợp còn lại nếu không sắp xếp trước).

Bình luận

Please read the guidelines before commenting.


Không có bình luận tại thời điểm này.