小红的平行四边形
链接:https://ac.nowcoder.com/acm/problem/273952
来源:牛客网
题目描述
小红在平面上有n个点,她准备选择其中四个点画一个平行四边形。请你帮小红求出平行四边形的最大面积。
输入描述:
第一行输入一个正整数n,代表点的数量。
接下来的n行,每行输入2个整数
x
i
x_ i
xi 和
y
i
y_i
yi ,代表第i个点的坐标。
4
≤
n
≤
1000
4≤n≤1000
4≤n≤1000
−
1
0
9
≤
x
i
,
y
i
≤
1
0
9
−10^9 ≤x_i ,y_i ≤10^9
−109≤xi,yi≤109
保证不存在两个重合的点。
输出描述:
如果不存在平行四边形,请输出-1。
否则输出一个浮点数,代表平行四边形的面积。保留一位小数。
输入示例1
5
0 0
0 1
1 0
1 1
2 1
输出示例1
1.0
说明
选前四个点即可(正方形也是平行四边形)
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <sstream>//整型转字符串
// #include <stack>//栈
// #include <deque>//堆/优先队列
// #include <queue>//队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const ll N=1e3+10;
ll x[N],y[N];
vector<PII> v;
int main()
{
ll n;
cin>>n;
for(ll i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++)
{
if(i!=j)
{
ll x1=x[i]-x[j],y1=y[i]-y[j];
if(x1<0||(!x1&&y1<0)) continue;
ll w=x[i]*y1-y[i]*x1,t=x1*3e9+y1;
v.push_back({t,w});
}
}
sort(v.begin(),v.end());
ll t1=-9e18,t2=0;
ll ans=0;
for(auto [i,j]:v)
{
if(i!=t1) t2=j;
t1=i;
ans=max(ans,j-t2);
}
if(!ans) cout<<-1<<endl;
else cout<<ans<<".0"<<endl;
return 0;
}