Tứ giác

Xem dạng PDF

Gửi bài giải

Điểm: 0,50 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 1G
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trên hệ trục toạ độ ~Oxy~, cho một đa giác lồi được tạo bởi ~N~ điểm có toạ độ nguyên.

Yêu cầu: Hãy tìm hình tứ giác có diện tích lớn nhất được tạo bởi ~4~ trong ~N~ điểm của đa giác lồi đã cho.

Input

  • Dòng thứ nhất ghi số ~N~ ~(4 \le N \le 10^4)~ là số đỉnh của đa giác lồi;
  • ~N~ dòng tiếp theo, mỗi dòng chứa hai số nguyên ~x, y~ ~(|x|, |y| \le 10^5)~ biểu diễn toạ độ các đỉnh của đa giác. Thứ tự các đỉnh được liệt kê theo chiều kim đồng hồ.

Output

Gồm một số duy nhất là diện tích lớn nhất của tứ giác tìm được. Kết quả lấy chính xác ~1~ chữ số sau phần thập phân.

Ví dụ

Input
5
0 2
1 3
2 2
2 0
0 0
Output
4.0
Giải thích

Chọn các đỉnh: ~(0, 2), (2, 2), (2, 0), (0, 0)~.

Input
6
4 2
3 3
4 5
6 5
7 3
6 2
Output
6.5
Giải thích

Chọn các đỉnh: ~(3, 3), (4, 5), (6, 5), (6, 2)~.

Ràng buộc

  • Có ~40\%~ số test ứng với ~40\%~ số điểm có ~N \le 50~;
  • ~30\%~ số test khác ứng với ~30\%~ số điểm có ~N \le 200~;
  • ~20\%~ số test khác ứng với ~20\%~ số điểm có ~N \le 2000~;
  • ~10\%~ số test còn lại ứng với ~10\%~ số điểm không có ràng buộc gì thêm.

Bình luận

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



  • -1
    hvycutis1tg  đã bình luận lúc 8, Tháng 6, 2025, 14:49

    include <iostream>

    include <vector>

    include <iomanip>

    include <algorithm>

    using namespace std;

    // Hàm tính diện tích của tứ giác double area(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { return 0.5 * abs(x1 * y2 + x2 * y3 + x3 * y4 + x4 * y1 - (y1 * x2 + y2 * x3 + y3 * x4 + y4 * x1)); }

    int main() { int n; cout << "Nhập số đỉnh của đa giác lồi: "; cin >> n;

    vector&lt;pair<int, int>> points(n);
    cout << "Nhập tọa độ các đỉnh: " << endl;
    for (int i = 0; i < n; i++) {
        cin >> points[i].first >> points[i].second;
    }
    
    double maxArea = 0.0;
    
    // Duyệt qua tất cả các tứ giác có thể
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            for (int k = j + 1; k < n; k++) {
                for (int l = k + 1; l < n; l++) {
                    double currentArea = area(points[i].first, points[i].second,
                                               points[j].first, points[j].second,
                                               points[k].first, points[k].second,
                                               points[l].first, points[l].second);
                    maxArea = max(maxArea, currentArea);
                }
            }
        }
    }
    
    cout << fixed << setprecision(6) << maxArea << endl;
    
    return 0;
    

    }