POJ 3384 Feng Shui 半平面交

2022-05-05 21:39:07 字數 2649 閱讀 5201

風水。。。是一門藝術。。。我在想要不要看看《周易》《葬經》什麼的,等老了還能出去給人算算命,看看陰宅陽宅什麼的,混口飯吃。嘿嘿,扯遠了。。。

題意:給乙個凸多邊形,然後在裡面放兩個半徑為r的圓。問怎麼放能使覆蓋的面積最大(spj)。

思路:把多邊形的每一條邊向「內」移r的距離,交得乙個新多邊形。在多邊形上找兩個盡量圓的點,放上圓心。

關於怎麼向內移動r的距離,見下圖

所以 point[i] 和 point[i+1] x軸上移動的距離就是r*cos(th), y軸上移動距離就是r*sin(th);

view code

//

#pragma comment(linker,"/stack:327680000,327680000")

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define cl(arr, val) memset(arr, val, sizeof(arr))

#define rep(i, n) for((i) = 0; (i) < (n); ++(i))

#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))

#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))

#define l(x) (x) << 1

#define r(x) (x) << 1 | 1

#define mid(l, r) (l + r) >> 1

#define min(x, y) (x) < (y) ? (x) : (y)

#define max(x, y) (x) < (y) ? (y) : (x)

#define e(x) (1 << (x))

#define iabs(x) (x) < 0 ? -(x) : (x)

#define out(x) printf("%i64d\n", x)

#define read() freopen("data.in", "r", stdin)

#define write() freopen("data.out", "w", stdout);typedef

long

long

ll;const

double eps = 1e-8

;const

double pi = acos(-1.0

);const

int inf = ~0u>>2

;using

namespace

std;

const

int maxn = 1010

;struct

point

point(

double a, double

b): x(a), y(b) {}

void

input()

};point point[maxn], p[maxn], q[maxn];

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

int ccnt, n; //

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

double

r;inline

int dbcmp(double x)

inline

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

inline point intersect(point x, point y,

double a, double b, double c)

inline

void cut(double a, double b, double c)

}for(i = 1; i <= cur; ++i) p[i] =q[i];

p[cur+1] = q[1]; p[0] =p[cur];

ccnt =cur;

}double

ddis(point a, point b)

void solve()

double tmp, maxd = 0

;

int a1 = 0, a2 = 0

;

for(i = 1; i <= ccnt; ++i) }}

printf(

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

", p[a1].x, p[a1].y, p[a2].x, p[a2].y);

}void

init()

intmain()

return0;

}

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之後,半...