zoukankan      html  css  js  c++  java
  • L3-021 神坛(极角排序求三角形最小面积)

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

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

    输入格式:

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

    输出格式:

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

    输入样例:

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

    输出样例:

    0.500
    

    样例解释

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

    题意

    N个点求最小三角形。

    题解

    首先需要知道3个点如何求S,0.5*abs(aXb)

    枚举每个点,极角排序,求出相邻向量的面积取个最小

    通过画图,可以发现若不取相邻,虽然也可以但是得多一层循环不能接受

    取相邻,可以发现刚好覆盖了所有最小的三角形

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=5005;
     5 
     6 int n;
     7 struct point//存储点
     8 {
     9     ll x,y;
    10 }p[N],c[N];
    11 bool cmp(point a,point b)//按顺时针排序
    12 {
    13     return b.y*a.x>b.x*a.y;
    14 }
    15 int main()
    16 {
    17     scanf("%d",&n);
    18     for(int i=0;i<n;i++)
    19         scanf("%lld%lld",&p[i].x,&p[i].y);
    20     ll ans=1e18;
    21     for(int i=0;i<n;i++)
    22     {
    23         int k=0;
    24         for(int j=0;j<n;j++)
    25         {
    26             if(i!=j)
    27             {
    28                 c[k].x=p[j].x-p[i].x;
    29                 c[k].y=p[j].y-p[i].y;
    30                 k++;
    31             }
    32         }
    33         sort(c,c+k,cmp);
    34         for(int j=1;j<k;j++)
    35             ans=min(ans,abs(c[j].y*c[j-1].x-c[j].x*c[j-1].y));
    36     }
    37     printf("%.3f
    ",ans/2.);
    38     return 0;
    39 }
  • 相关阅读:
    计算与软件工程作业四
    计算与软件工程作业四(一)
    计算与软件工程作业三
    计算与软件工程作业二
    计算与软件工程作业一
    4.2上机课作业
    java第三次作业
    java第一次作业 2020 3.7
    十三周上机练习
    第十二周作业
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/10280261.html
Copyright © 2011-2022 走看看