题解 | 小红的平行四边形

小红的平行四边形

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")

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务