l3-021 神壇 (30 分)
在古老的邁瑞城,巍然屹立著 n 塊神石。長老們商議,選取 3 塊神石圍成乙個神壇。因為神壇的能量強度與它的面積成反比,因此神壇的面積越小越好。特殊地,如果有兩塊神石座標相同,或者三塊神石共線,神壇的面積為0.000
。
長老們發現這個問題沒有那麼簡單,於是委託你程式設計解決這個難題。
輸入在第一行給出乙個正整數 n(3 ≤ n ≤ 5000)。隨後 n 行,每行有兩個整數,分別表示神石的橫座標、縱座標(−109≤ 橫座標、縱座標 <109)。
在一行中輸出神壇的最小面積,四捨五入保留 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,...