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