题解 | 小红的平行四边形
小红的平行四边形
https://www.nowcoder.com/practice/917247383d1f4ff18e58586285f7a8c7
平行四边形的面积,取平面上(共顶点)向量(x,y,0)与(u,v,0) S = abs(x*v-y*u)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin>>n;
map<pair<ll,ll>,vector<pair<ll,ll> > > mp;//记录平行边。
vector<pair<ll,ll> > pq;//记录点
for(int i=0;i<n;i++){
ll u,v;
cin>>u>>v;
pq.push_back({u,v});
}
for(int i=0;i<n;i++){//枚举平行边
auto [x,y] = pq[i];
for(int j=i+1;j<n;j++){
auto[x1,y1] = pq[j];
if(x>=x1)
mp[{x-x1,y-y1}].push_back({i,j});//避免方向不一致导致漏解
else mp[{x1-x,y1-y}].push_back({i,j});
}
}
ll ans = -1;
for(auto it : mp){
auto [pi,a] = it;
if(a.size()<=1) continue;//平行边只有一条是跳过
for(int i=0;i<a.size();i++){
auto [p1,p2] = a[i];
auto [x,y] = pq[p1];
auto [x1,y1] = pq[p2];
for(int j=i+1;j<a.size();j++){//向量叉乘求面积
auto [p3,p4] = a[j];
auto [x2,y2] = pq[p3];
pair<ll,ll> lp = {x2-x,y2-y};
pair<ll,ll> rp = {x1-x,y1-y};
ans = max(ans,abs(lp.first*rp.second-lp.second*rp.first));
}
}
}
if(ans!=-1&&ans!=0)
printf("%ld.0",ans);
else printf("-1");
}
// 64 位输出请用 printf("%lld")
查看14道真题和解析
