L3 021 神壇 計算幾何

2021-09-12 10:35:29 字數 1639 閱讀 2003

l3-021 神壇 (30 分)

在古老的邁瑞城,巍然屹立著 n 塊神石。長老們商議,選取 3 塊神石圍成乙個神壇。因為神壇的能量強度與它的面積成反比,因此神壇的面積越小越好。特殊地,如果有兩塊神石座標相同,或者三塊神石共線,神壇的面積為0.000

長老們發現這個問題沒有那麼簡單,於是委託你程式設計解決這個難題。

輸入在第一行給出乙個正整數 n(3 ≤ n ≤ 5000)。隨後 n 行,每行有兩個整數,分別表示神石的橫座標、縱座標(−10​9​​≤ 橫座標、縱座標 <10​9​​)。

在一行中輸出神壇的最小面積,四捨五入保留 3 位小數。

8

3 42 4

1 14 1

0 33 0

1 34 2

0.500
輸出的數值等於圖中紅色或紫色框線的三角形的面積。

思路:

對於乙個點a,把其他點與這個點構成的向量按照逆時針排序

比如向量ab,就是用b的橫縱左邊分別減去a的橫縱座標。

那麼a點與其他點構成的向量集合,就是從a發出n-1道光。

逆時針排序後,由點abc構成的最小三角形,點bc肯定相鄰,那麼就判斷一下誰構成的面積最小就可以了。

(注:三角形的面積=abs(x1*y2-y2*x1)/2)

要注意的是:

float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字; 

double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。 

開始我用double存的座標點,然後一直錯= =!然後才發現題目點的左邊範圍是1e9級別的,所以用double存邊,求面積的時候就會爆,用long long存邊,然後把ans也設成long long型的,最後再(double)ans/2

**如下:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

typedef pairp;

const int inf=0x3f3f3f3f;

const int n=5015,mod=32767;

struct aqq[n],tmp[n];

bool cmp(a a,a b)

int main()

double ans=2e18;

for(int i=0;i

sort(tmp,tmp+k,cmp);

for(int j=0;j

}printf("%.3f\n",ans);

}

L3 021 神壇 極角排序

l3 021 神壇 30 分 在古老的邁瑞城,巍然屹立著 n 塊神石。長老們商議,選取 3 塊神石圍成乙個神壇。因為神壇的能量強度與它的面積成反比,因此神壇的面積越小越好。特殊地,如果有兩塊神石座標相同,或者三塊神石共線,神壇的面積為0.000。長老們發現這個問題沒有那麼簡單,於是委託你程式設計解決...

L3 021 神壇 (30 分 計算幾何

在古老的邁瑞城,巍然屹立著 n 塊神石。長老們商議,選取 3 塊神石圍成乙個神壇。因為神壇的能量強度與它的面積成反比,因此神壇的面積越小越好。特殊地,如果有兩塊神石座標相同,或者三塊神石共線,神壇的面積為0.000。長老們發現這個問題沒有那麼簡單,於是委託你程式設計解決這個難題。輸入在第一行給出乙個...

團體程式設計天梯賽 L3 021 神壇(極角排序)

思路 1.一共n個點,對於每乙個點我們都可以將它作為頂點,那麼此點和其它n 1個點就會組成n 1個向量 2.n 1個向量中,我們任意選取兩個向量都可以滿足 選取三塊石頭 這個條件,但是我們現在的目標是面積最小,因此我們需要對這n 1個向量進行極角排序 證明請參考 3.a b c a,b,c a,b,...