凸包例題 UVa 10652

2021-10-03 00:27:32 字數 1832 閱讀 8261

題意:有n塊矩形木板,你的任務是用乙個面積盡量小的凸多邊形把它們包起來,並計算出木板佔整個包裝面積的百分比。

第一行輸入的是資料的組數,(t<50)。每組資料第一行為木板個數,(n<600)。以下n行每行五個實數,x,y,w,h,j。j是順時針旋轉的角度。

sample input

4 7.5 6 3 0

8 11.5 6 3 0

9.5 6 6 3 90

4.5 3 4.4721 2.2361 26.565

sample output

64.3 %

思路:這就是乙個簡單的凸包問題,輸入的所有點為凸包中的點,求包含這些點的凸包。

**:

#include #include #include #include #include using namespace std;

const int n=2500;

#define eps 1e-8

//點的定義

struct point;

void input()

}; //向量

typedef point vector;

//判斷相等

int dcmp(double x)

template t sqr(t x)

//向量的運算

vector operator + (vector a,vector b)

vector operator -(vector a,vector b)

vector operator *(vector a,double p)

vector operator /(vector a,double p)

double dot(vector a,vector b)

bool operator < (const point &a ,const point &b)

bool operator <= (const point &a,const point &b)

bool operator == (const point &a,const point &b)

//向量的長度

double length(vector a)

//求倆向量的夾角

double angle(vector a,vector b)

//求差積

/* 在二維空間中,叉乘還有另外乙個幾何意義就是:

axb等於由向量a和向量b構成的平行四邊形的面積。

*/double cross(vector a,vector b)

//角度轉為弧度

double torad(double deg)

//求凸包

int convexhull(point *p,int n,point *ch)

int k=m;

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

if(n>1) m--;

return m; }

//向量旋轉

vector rotate(vector a,double rad)

//求多邊形面積

double polygonarea(point *p,int n)

int main()

int m=convexhull(p,pc,ch);

double area2=polygonarea(ch,m);

printf("%.1lf %%\n",area1*100/area2); }

return 0;

}

UVA 10652 凸包簡單問題

題目鏈結 題意 見訓練指南272頁 include include include include include include include include include include define mm a memset a,0,sizeof a typedef long long ll...

計算幾何 凸包入門及例題

andrew演算法 演算法做兩次掃瞄,先從最左邊的點沿下凸包掃瞄到最右邊,再從最右邊的點沿上凸包掃瞄到最左邊,上下合在一起是完整的凸包。以下convex hull函式為核心求解凸包的函式,凸包頂點放在ch陣列中,返回值為頂點數。計算幾何 intsgn db x struct point point ...

UVa 11168 Airport凸包與直線方程

題意 給出平面上的n個點,求一條直線,使得所有點在該直線的同一側且所有點到該直線的距離和最小,輸出該距離和。思路 要使所有點在該直線的同一側,明顯是直接利用凸包的邊更優。所以列舉凸包的沒條邊,然後求距離和。直線一般式為ax by c 0.點 x0,y0 到直線的距離為 fabs ax0 by0 c ...