HDU 5531 平面幾何 三分

2021-07-07 07:49:37 字數 2333 閱讀 3463

題意是給你n個點,然後要求以每個點為圓心畫乙個圓,使得兩兩相鄰的圓心的圓相切,不相鄰的圓可以相交,如果可以作這樣的圓那麼輸出圓面積和的最小值和,每個圓的半徑,否則輸出impossible。

首先我們求出每一條鄰邊的長度,記為l1, l2, l3, ... ,ln, 假定第乙個圓的半徑為x,那麼我們可以用x表示所有圓的半徑,分別為x, l1-x, l2-l1+x, l3-l2+l1-x .... 需要利用的就是第乙個半徑和最後乙個半徑的和必須等於ln(因為相切)。 發現最後一項+x還是-x和n的奇偶性有關,很明顯需要分類。

若n是奇數:

那麼最後乙個圓的半徑是l[n-1]-l[n-2] + l[n-3]-l[n-4] + ... + l[2]-l[1] + x, 它和第乙個圓的半徑x的和必須是l[n], 所以可以求出x,因為x的值必須是這個,所以只需要簡單的判定是不是所有的半徑都大於等於0,如果不是就無解,否則計算結果。

若n是偶數:

那麼最後乙個圓的半徑是l[n-1]-l[n-2] + l[n-3]-l[n-4] + ... + l[3]-l[2] + l[1] - x, 它和第乙個圓的半徑x的和必須是ln[n] ,可以發現是乙個常數方程,要麼恆成立要麼恆不成立。恆不成立顯然就是無解的,如果恆成立,答案就是x^2 + (l[1]-x)^2 + (l[2]-l[1]+x)^2 + ... + (l[n-1]-l[n-2] + l[n-3]-l[n-4] + ... + l[3]-l[2] + l[1] - x)^2的結果乘以pi,這個式子展開是關於x的二次函式,可以通過三分求出極值,但是我們需要確定x的範圍。顯然x只需要滿足任意乙個圓的半徑都非負就可以了,如果x的範圍為空就無解,否則x的最優解就是區間三分找到的極值。

#include using namespace std;

#define maxn 11111

#define eps 1e-7

#define pi acos (-1)

struct point p[maxn];

double l[maxn]; //存第i條邊到i+1條邊的距離

double g[maxn]; //存l[n-1]-l[n-2]+l[n-3]-l[n-4]...

double ans[maxn]; //第i個圓的面積

int n;

double a, b, c; //二次函式的三個引數ax^2+bx+c

double dis (point a, point b)

double f (double x)

void work (double &l, double &r)

else

}return ;

}void solve_even ()

a = n;

b = c = 0.0;

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

double l, r, ll, rr;

work (l, r); //找到x的範圍

if (l > r)

while (r-l > eps)

double x = (l+r)/2.0; //第乙個半徑為x的時候總面積最小

bool ok = 1;

memset (ans, 0, sizeof ans);

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

else

}if (!ok)

double sum = 0.0;

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

printf ("%.2f\n", sum*pi);

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

printf ("%.2f\n", ans[i]);

return ;

}void solve_odd ()

else

}if (!ok)

double sum = 0.0;

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

printf ("%.2f\n", sum*pi);

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

printf ("%.2f\n", ans[i]);

return ;

}int main ()

p[n+1] = p[1];

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

g[1] = 0;

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

if (n&1)

solve_odd ();

else

solve_even ();

}return 0;

}

HDU 5531 幾何公式

include include include include using namespace std const int maxn 1e4 5 const double inf 1e20 const double pi acos 1 const double eps 1e 8 struct poi...

HDU 5531(Rebuild )分析 三分

給定乙個n,代表有n個點,給出n個座標,以每個座標為圓心畫圓。要求 相鄰的兩個點畫的圓必須相切 第i個和第i 1個,及第乙個點和最後乙個點 所有圓的面積之和最小。注 半徑可以為0。如果n為奇數,通過列方程可以知道,那麼就可以直接求r1,然後 r i dist i 1 r i 1 依次把所有的r求出來...

HDU5572平面幾何問題

hdu 5572an easy physics problem 題意 光滑平面,乙個剛性小球,乙個固定的剛性圓柱體 給定圓柱體圓心座標,半徑 小球起點座標,起始運動方向 向量 終點座標 問能否到達終點,小球運動中如果碰到圓柱體會反射 基本物理知識 思路 根據高中平面幾何知識很快找到判斷方法,但是向量...