風水。。。是一門藝術。。。我在想要不要看看《周易》《葬經》什麼的,等老了還能出去給人算算命,看看陰宅陽宅什麼的,混口飯吃。嘿嘿,扯遠了。。。
題意:給乙個凸多邊形,然後在裡面放兩個半徑為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之後,半...