题意:给你点集(n<=50)找到4个点构成最大矩形输出面积,没有矩形return -1;
解:
1、暴力找到4个点
2.判断是否为矩形:
对角线相等并且中点相同
3、面积就是 长*宽 ,长宽就是 1个点到其他3个点构成的边中较小的两个边。
#include <bits/stdc++.h>
#define en '\n'
const int inf=0x3f3f3f3f;
using namespace std;
const int maxn =1e2+10;
#define pb push_back
int rd(){int tt;scanf("%d",&tt);return tt;}
typedef long long int ll;
vector<int>ans;
struct node{
double x,y;
};
vector<node>vec;
int a[maxn];
const double eps =1e-6;
#define pb push_back
class RectangleHunt{
#define pf(x) ((x)*(x))
public:
double dis(node x,node y){return sqrt(pf(x.x-y.x)+pf(x.y-y.y));}
node zhong(node x,node y){return (node){(0.5*(x.x+y.x)),0.5*(x.y+y.y)};}
double cal(node x,node y,node k,node l){
double disx=dis(x,y);
double disy=dis(k,l);
if(abs(disx-disy)>eps){return -1;}
node mid1=zhong(x,y);
node mid2=zhong(k,l);
if(abs(mid1.x-mid2.x)>eps or abs(mid1.y-mid2.y)>eps )return -1;
vector<double>tem;
tem.pb(dis(x,y)),tem.pb(dis(x,k));tem.pb(dis(x,l));
sort(tem.begin(),tem.end());
return tem[0]*tem[1];
}
double largest(vector<int>x, vector<int>y){
for(int i=0;i<x.size();i++){vec.pb((node){(double)x[i],(double)y[i]});}
int n=x.size();
double ans=-1;
for(int i=0;i<=n;i++){
for(int j=0;j<n;j++){
if(i==j)continue;
for(int k=0;k<n;k++){
if(k==i or k==j)continue;
for(int l=0;l<n;l++){
if(l==i or l==j or l==k )continue;
ans=max(ans,cal(vec[i],vec[j],vec[k],vec[l]));
}
}
}
}
return ans;
}
};
#ifdef swt
RectangleHunt tem;
signed main(){
freopen("input2.txt","r",stdin);
vector<int>s,ss;int n=rd();
for(int i=1;i<=n;i++){s.pb(rd());}
for(int i=1;i<=n;i++){ss.pb(rd());}
cout<<tem.largest(s,ss)<<en;
}
#endif // swt