hdu 5251 包圍點集最小矩形

2022-06-02 13:09:11 字數 2964 閱讀 4539

題意:小度熊有乙個桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把這些矩形包圍起來的面積最小的矩形的面積是多少。

求個凸包,矩形的邊一定在凸包上,列舉邊,求最大值,即為所求,多年不拍幾何,直接套了個模板

以後還得練練

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9 typedef double

typev;

10const

double eps = 1e-8;11

const

int n = 4055;12

int sign(double

d)15

struct

point

21 point operator-(point d)

27 point operator+(point d)

33void read()

34}ps[n],pd[n];

35int

n, cn;

36double

dist(point d1, point d2)

39double

dist2(point d1, point d2)

42bool

cmp(point d1, point d2)

45//

st1-->ed1叉乘st2-->ed2的值

46typev xmul(point st1, point ed1, point st2, point ed2)

49typev dmul(point st1, point ed1, point st2, point ed2)

52//

多邊形類

53struct

poly

58//

加進乙個點

59void

push(point tp)

62//

第k個位置

63int trim(int

k)66

void clear()

67};

68//

返回含有n個點的點集ps的凸包

69 poly graham(point* ps, int

n)76

return

ans;77}

78 ans.push(ps[0

]);79 ans.push(ps[1

]);80 point* tps =ans.ps;

81int top = -1

;82 tps[++top] = ps[0

];83 tps[++top] = ps[1

];84

for(int i = 2; i < n; i++)

88int tmp = top; //

注意要賦值給tmp!

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

93 ans.pn =top;

94return

ans;95}

96//

求點p到st->ed的垂足,列引數方程

97point getroot(point p, point st, point ed)

105//

next為直線(st,ed)上的點,返回next沿(st,ed)右手垂直方向延伸l之後的點

106 point change(point st, point ed, point next, double

l)116

//求含n個點的點集ps的最小面積矩形,並把結果放在ds(ds為乙個長度是4的陣列即可,ds中的點是逆時針的)中,並返回這個最小面積。

117double getminarearect(point* ps, int n, point*ds)else

138for(r=u=i = 0; i < cn; i++)

143while(dmul(con[i], con[i+1

], con[i], con[r])

144<= dmul(con[i], con[i+1], con[i], con[(r+1)%cn]))

147while(dmul(con[i], con[i+1

], con[i], con[l])

148 >= dmul(con[i], con[i+1], con[i], con[(l+1)%cn]))

151 tmp = dmul(con[i], con[i+1], con[i], con[r]) - dmul(con[i], con[i+1

], con[i], con[l]);

152 tmp *= xmul(con[i], con[i+1

], con[i], con[u]);

153 tmp /= dist2(con[i], con[i+1

]);154 len = xmul(con[i], con[i+1], con[i], con[u])/dist(con[i], con[i+1

]);155

if(sign(tmp - ans) < 0

)162

}163

}164

return ans+eps;

165}

166int

main()

167183

double q=getminarearect(ps,4*n,pd);

184 printf("

%d\n

",int(q+0.5

));185

}186 }

view code

hdu5251 凸包 旋轉卡殼

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

面試題41 包圍區域

包圍區域是乙個典型的dfs的題目。大意是乙個二維陣列中存在字元 x 和 o 將被 x 包圍的 o 全部變為 x 具體做法是從陣列的邊界上為 o 的起點開始dfs,將dfs過程中遇到的字元標記為 y 然後遍歷二維陣列,將 y 的變為 o 其餘為 x 即可。題目描述 given a 2d board c...

Untiy網格程式設計篇 一 包圍盒效果

untiy網格程式設計篇 一 包圍盒效果 純 網格實現 1.效果圖 選中不同的模型,會標識出包圍盒的效果 2.實現思路 第一步 計算模型的aabb包圍盒 第三步 設定網格頂點和網格的三角面 第四步 得到上圖的效果 3.部分 using unityengine using system.collect...