HDU 2823 旋轉卡殼

2022-04-09 02:11:19 字數 1853 閱讀 4791

//開始 自己 做 ,不是 wa 就是 tle

// 後 來 還是看別人**的

//注意 此 下面 **c++ ac   ,g++ tle;

#include#include

#include

#include

using

namespace

std;

#define n 1005

#define pr 1e-8

struct

tpoint

; tpoint(

double _x,double

_y):x(_x),y(_y){}

tpoint

operator-(const tpoint p)

}s;struct

tpolygon

ply1,ply2;

int dblcmp(double a)

double min(double a,double b)

double dist(tpoint a,tpoint b)//

兩點距double cross(tpoint a,tpoint b,tpoint c)//

叉積double dot(tpoint a,tpoint b,tpoint c)//

點積bool cmop(tpoint a,tpoint b)//

x、y排序

bool cmp(tpoint a,tpoint b)//

叉積內排序

tpolygon graham(tpolygon ply)

//凸包

ply.n=k;

return

ply;

}double disps(tpoint a,tpoint b,tpoint c)//

點到線段的最近距離

double disss(tpoint a,tpoint b,tpoint c,tpoint d)//

兩條線段最近距離

double solve(tpolygon pl,tpolygon pr,int p,int q)//

旋轉卡殼,求凸邊形最近距離

return

min;

}void gettop(tpolygon pl,tpolygon pr,int &l,int &r)//

得到最下和最上點

for(i=0;i)

}bool segcross(tpoint a,tpoint b,tpoint c,tpoint d)//

ab交線段cd

bool pintoply(tpoint a,tpolygon res)//

點在多邊形內、環顧法

bool plyintoply(tpolygon res1,tpolygon res2)//

包含bool plycrossply(tpolygon res1,tpolygon res2)//

相交int

main()

//多邊形1擁有最少點

if(ply1.n==1

)

}else

if(ply1.n==2)//

二對多

else

if(tmp) mindis=0

;

else

for(i=0;i)

mindis=min(mindis,disss(ply1.p[0],ply1.p[1],ply2.p[i],ply2.p[i+1

]));}}

}else}}

printf(

"%.4lf\n

",mindis);

}return0;

}

hdu5251 凸包 旋轉卡殼

傳送門 hdu5251 矩形面積 接觸了旋轉卡殼不久,感覺很神奇 這個題是要尋找乙個矩形來覆蓋住桌面上的小矩形,小矩形即四個點啦,所以就是 找乙個矩形覆蓋住這些點,也就要求乙個凸包,再用矩形把凸包蓋住,那就很明顯的 是旋轉卡殼了,類似旋轉卡殼求凸包的寬度,只是這是求矩形面積的最小值 完整 inclu...

旋轉卡殼 Rotating Calipers

上週做了一些凸包等計算幾何的問題,感覺挺有意思的,想好好研究一下,發現乙個推薦的英文 雖然沒有多少,但是還是想試著通過自己做題的領悟加上6級水平的英語來翻譯一下,請批評指正。原文 在1978年,m.i.shamos s 博士 計算幾何 標誌著這一領域在電腦科學中的誕生。這在他發表的成果中是乙個尋找凸...

旋轉卡殼演算法

直接按照這個描述可以實現旋轉卡殼演算法,但是 肯定相當冗長。逆向思考,如果qa,qb是凸包上最遠兩點,必然可以分別過qa,qb畫出一對平行線。通過旋轉這對平行線,我們可以讓它和凸包上的一條邊重合,如圖中藍色直線,可以注意到,qa是凸包上離p和qb所在直線最遠的點。於是我們的思路就是列舉凸包上的所有邊...