計蒜客47 圈果樹(二維凸包)

2021-08-02 06:10:01 字數 1522 閱讀 8426

傳送門

小馬承包了乙個果園,想修乙個圍欄,但是不希望砍掉任何的果樹。對於給出的所有的果樹的座標,計算一下最小的圍住所有的果樹的圍欄的長度。

輸入資料的第一行包括乙個整數 n(0≤ n ≤10,000)表示農夫約翰想要圍住的放牧點的數目。接下來 n 行,每行由兩個由空格分隔的實數組成,xi 和 yi,對應平面上的放牧點座標(-1,000,000 ≤ xi,yi ≤ 1,000,000)。數字用小數表示。

輸出包括乙個實數,表示必須的圍欄的長度(保留兩位有效小數)

樣例輸入

4 

4 8

4 12

5 9.3

7 8

樣例輸出12.00

解題思路:

直接計算乙個二維凸包,然後計算凸包上相鄰兩兩點的距離,然後加和就是周長。

**:

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

double inf = 1e18+5;

const

int maxn = 1e4 + 5;

const

double eps = 1e-10;

const

double pi = acos(-1.0);

int double_cmp(double x)

struct point

point (double _x, double _y, int i):x(_x),y(_y),id(i) {}

bool

operator

<(const

struct point &tmp)const

bool

operator == (const

struct point &tmp)const

} p[maxn],st[maxn];

bool cmp(const point& p1, const point& p2)

double xmulti(point a, point b, point c)///ac x ab

double dis(point a, point b)

double dis2(point a, point b)

double dot(point a, point b, point c)///點積 ab . ac

int convexhull(point *p, int n, point *st)///凸包

int k = m;

for(int i=n-2; i>=0; i--)

if(n > 1)

m--;

return m;

}int main()

return

0;}

計蒜客 羊圈復原 (凸包模板)

題目大意 判斷羊圈是否能夠復原。題目思路 首先先求出凸包,如果凸包每條邊上都有點存在的話,那麼這凸包和原來是一樣的,否則有可能和原來不一樣。也就是說你需要來判斷兩點之間是否是緊挨著的,如果是則不滿足。坑點 用graham scan的演算法,會忽略一開始時三點共線的情況,所以要考慮這種情況,否則會出現...

二維凸包演算法

部落格參考 謝謝 chao xun 把凸包寫的這麼詳細。關於凸包的問題的解決的最初思路是這樣的。1 找到乙個基準點 必須在凸邊上 2 以基準點做射線,然後將該射線向固定方向旋轉,直到接觸到乙個新的點。3 以 2 中找到的點作為新的基準點,作射線繼續朝著一開始的固定的方向旋轉 4 反覆重複2,3直到最...

題解 二維凸包

呵呵呵複習一下這個東西免得做到計算幾何連暴力都不會嚶嚶嚶 免得到時候寫斜率優化結果凸包不會了嚶嚶嚶 數學走起 vec x 1,y 1 vec x 2,y 2 shadow times vec x 1y 2 x 2y 1 根據右手螺旋定則。shadow 是我亂搞的符號,雖然我搞不懂為什麼是這樣,但是這...