poj3384Feng Shui(半平面交

2022-05-15 21:40:46 字數 1877 閱讀 4039

鏈結

將邊長向內推進r,明顯這樣把第乙個圓的圓心放在新的邊長是肯定是最優的,與原本邊相切,然後再找新多邊上的最遠的兩點即為兩圓心。

1 #include 2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10using

namespace

std;

11#define n 2010

12#define ll long long

13#define inf 0xfffffff

14const

double eps = 1e-8;15

const

double pi = acos(-1.0

);16

const

double inf = ~0u>>2;17

const

int maxn=1550;18

intm;

19double

r;20

int ccnt,curcnt;//

此時ccnt為最終切割得到的多邊形的頂點數、暫存頂點個數

21struct

point

2225

};26

typedef point pointt;

27 pointt operator -(point a,point b)

2831 point points[maxn],p[maxn],q[maxn];//

讀入的多邊形的頂點(順時針)、p為存放最終切割得到的多邊形頂點的陣列、暫存核的頂點

32void getline(point x,point y,double &a,double &b,double &c) //

兩點x、y確定一條直線a、b、c為其係數

3338

void

initial()

3945 point intersect(point x,point y,double a,double b,double c) //

求x、y形成的直線與已知直線a、b、c、的交點

4654

void cut(double a,double b ,double

c)55

68if(a*p[i+1].x + b*p[i+1].y + c > 0) //

原理同上

6972}73

}74for(int i = 1; i <= curcnt; ++i)p[i] = q[i];//

將q中暫存的核的頂點轉移到p中

75 p[curcnt+1] = q[1

];76 p[0] =p[curcnt];

77 ccnt =curcnt;78}

79double

dis(point a)

8083

void solve(int

r)84

103double ans = -1

;104

point p1, p2;

105int

i,j;

106for(i = 1; i <= curcnt ; i++)

107for(j = i ; j<=curcnt ; j++)

108115

}116 printf("

%.4f %.4f %.4f %.4f\n

",p1.x,p1.y,p2.x,p2.y);

117}

118/*

void guizhenghua()

*/123

intmain()

124133

return0;

134 }

view code

POJ 3384 Feng Shui 半平面交

題目給出兩個圓和乙個多邊形 問是否能讓兩個圓在多邊形內。並且覆蓋的面積最大 圓的半徑為r,我們則讓多邊形的每條邊都往內部退r距離。然後求半平面交得出的點集中,最遠的兩個點則是兩圓的圓心即可 include include include include include include include...

半平面交 POJ 3384 Feng Shui

先把每條邊壓縮r的距離,求出半平面交,然後半平面交的最遠點對就是答案了。要注意最後的點數只有乙個時的情況,此時兩個圓重合。但是半平面交求出的平面是不含直線上的點,所以這時半平面交求出的點集為空。我的處理方法是壓縮每一條邊的時候少壓縮一點距離,這樣子求出的點不會是空集,注意把握好精度就可以了。incl...

POJ 3384 Feng Shui 半平面交

by cxlove 題目 給出乙個凸多邊形的房間,根據風水要求,把兩個圓形地毯鋪在房間裡,不能摺疊,不能切割,可以重疊。問最多能覆蓋多大空間,輸出兩個地毯的圓心座標。多組解輸出其中乙個 題目保證至少可以放入乙個圓,上一題中判斷過在乙個多邊形內是否能放入乙個半徑為r的圓。同樣將多邊形的邊內移r之後,半...