題意:有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 ...