P9949

· · 题解

思路

首先,肯定可以 O(n^{3}) 暴力枚举,考虑优化。

要知道,如果与 x 轴和 y 轴均平行,那么有两个点 x 坐标相等,有两个 y 坐标相等。

三角形的一条边长为 x 坐标相等的两个点 y 坐标之差的绝对值,另一条边长为 y 坐标相等的两个点 x 坐标之差的绝对值。

要想要面积最大,可以让三角形的两条边分别最大,时间复杂度降了一维。

代码

#include<bits/stdc++.h>
using namespace std;
int x[105],y[105],n,maxx=0,xmax[105],ymax[105];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) continue;
            if(x[i]==x[j]) xmax[i]=max(xmax[i],abs(y[i]-y[j]));//一条最大
            if(y[i]==y[j]) ymax[i]=max(ymax[i],abs(x[i]-x[j]));//另一条
        }
    }
    int maxx=0;
    for(int i=1;i<=n;i++) maxx=max(maxx,xmax[i]*ymax[i]);//求最大值
    cout<<maxx;
    return 0;
}