三角形

159 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

Farmer John 想要给他的奶牛们建造一个三角形牧场。

有 N 个栅栏柱子分别位于农场的二维平面上不同的点 (X1,Y1)…(XN,YN)。

他可以选择其中三个点组成三角形牧场,只要三角形有一条边与 x 轴平行,且有另一条边与 y 轴平行。

Farmer John 可以围成的牧场的最大面积是多少?

保证存在至少一个合法的三角形牧场。

输入格式

输入的第一行包含整数 N。

以下 N 行每行包含两个整数 Xi 和 Yi,均在范围 −104…104 之内,描述一个栅栏柱子的位置。

输出格式

由于面积不一定为整数,输出栅栏柱子可以围成的合法三角形的最大面积的两倍

数据范围

3≤N≤100

输入样例:

4
0 0
0 1
1 0
1 2

输出样例:

2

样例解释

位于点 (0,0)、(1,0) 和 (1,2) 的木桩组成了一个面积为 1 的三角形。所以,答案为 2⋅1=2。

只有一个其他的三角形,面积为 0.5。

思路

根据题意可以发现这是一道排列+模拟的题目,我们可以使用暴力枚举的方法进行解题。首先题目是需要找到一个直角三角形,于是我们可以选中一个点,然后找出跟他同一行的点、同一列的点,这样就可以组成直角三角形。这里使用三层循环遍历三角形上的每一个点。

注意:最后求体积时,因为答案需要乘以2,所以公式不用再除二;每一条边长可能为负数,使用abs函数使其一定为正数。

代码

#include <iostream>
#include <algorithm>
​
using namespace std;
​
typedef pair<int ,int> PII;
​
const int N = 110;
​
PII a[N];
​
int main()
{
    int n;
    cin >> n;
    for(int i = 0;i < n;i ++) cin >> a[i].first >> a[i].second;
    int res = 0;
    for(int i = 0;i < n;i ++)
    {
        for(int j = 0;j < n;j ++)
        {
            for(int k = 0;k < n;k ++)
            {
                if(i != j && i != k && j != k){
                    if(a[j].first == a[i].first && a[j].second == a[k].second)
                        res = max(res,abs(a[j].first - a[k].first) * abs(a[j].second - a[i].second));
                }
            }
        }
    }
    cout << res << endl;
    
    return 0;
}