zoukankan      html  css  js  c++  java
  • L3-021 神坛 (30 分)

    在古老的迈瑞城,巍然屹立着 n 块神石。长老们商议,选取 3 块神石围成一个神坛。因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好。特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面积为 0.000

    长老们发现这个问题没有那么简单,于是委托你编程解决这个难题。

    输入格式:

    输入在第一行给出一个正整数 n(3 ≤ n ≤ 5000)。随后 n 行,每行有两个整数,分别表示神石的横坐标、纵坐标(− 横坐标、纵坐标 <)。

    输出格式:

    在一行中输出神坛的最小面积,四舍五入保留 3 位小数。

    输入样例:

    8
    3 4
    2 4
    1 1
    4 1
    0 3
    3 0
    1 3
    4 2
    

    输出样例:

    0.500
    

    样例解释

    输出的数值等于图中红色或紫色框线的三角形的面积。

    altar.JPG

    暴力解只能对三个测试点,网上查的别人的解法,先按照极角排序,极角就是在极坐标下任意一点M和极点O连线的向量OM和x轴OX的夹角,对于两个含同点向量按照极角排序,按照叉乘积,如果向量1叉乘向量2结果为正,表示向量2在向量1的左边,为0表示共线,否则相反。

    已知两共起点向量,求组成三角形面积就是叉乘积取绝对值再乘0.5,因为三角形计算面积有个公式0.5absint。

    至于为啥要按照极角排序,应该是省去一些不必要的情况,排好序,只需要相邻俩向量求面积更新最小值即可。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #define inf 1e18
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> pa;
    int n;
    pa point[5000];
    pa line[5000];
    double mp[5000][5000];
    double ans = inf;
    bool cmp(pa a,pa b) {
        if(a.first * b.second == b.first * a.second) return a.first < b.first;
        return a.first * b.second > b.first * a.second;
    }
    int main() {
        scanf("%d",&n);
        for(int i = 0;i < n;i ++) {
            scanf("%lld%lld",&point[i].first,&point[i].second);
        }
        for(int i = 0;i < n;i ++) {
            int t = 0;
            for(int j = 0;j < n;j ++) {
                if(i == j) continue;
                line[t ++] = pa(point[j].first - point[i].first,point[j].second - point[i].second);
            }
            sort(line,line + t,cmp);
            for(int j = 1;j < t;j ++) {
                ans = min(ans,0.5 * abs(line[j - 1].first * line[j].second - line[j - 1].second * line[j].first));
            }
        }
        printf("%.3f",ans);
    }

    极角排序:https://www.cnblogs.com/aiguona/p/7248311.html

  • 相关阅读:
    理解RESTful架构
    Javascript闭包
    Javascript立即执行函数
    多个Jboss端口冲突配置;一个Jboss多个server端口配置
    MyEclipse部署Jboss出现java.lang.OutOfMemoryError: PermGen space
    css摘抄
    css 浮动和绝对定位的区别
    搭建第一个web项目:jasperReports+ireport制作pdf报表
    Hibernate的检索方式
    浅谈JavaScript的作用域
  • 原文地址:https://www.cnblogs.com/8023spz/p/10500697.html
Copyright © 2011-2022 走看看