HDU 5531 幾何公式

2021-07-10 14:25:19 字數 1615 閱讀 8688

#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 point

};int dcmp(double x)//

double distance(point a, point b)

double distance2(point a, point b)

point read_point()

point p[maxn];

int n, t;

double l, r, a[maxn], dis[maxn];

double get(double m)

return ret;

}double solve ()

return l;

}int main(int argc, char const *argv)

if ((l > r) || (n % 2 == 0 && dcmp(ans) != 0)) printf("impossible\n");

else

}return 0;

}

沒有想出做法,看了題解。

題意:按順序給出乙個多邊形,以多邊形的每個頂點為圓心作圓,使得任意兩相鄰點對應的圓相切,求所有圓面積總和的最小值。

畫個圖算兩下就出來了,發現只需要對n的奇偶性進行討論即可。

設每個點為pi(0 <= i <= n - 1),對應圓的半徑為ri,pi和p(i + 1)(預設pn為p0)的距離為di,則很顯然我們得到了n個方程:

fi:ri + r(i + 1) = di(0 <= i <= n - 1)。

通過這個方程我們發現,全部加起來除以2即得到了所有ri的和。當n為奇數時,將i為奇數的方程fi相加可以得到r1 + r2 + ...... + r(n - 1)的和,再用總和減去它即得到了r0,也就是說,n為奇數時,這個方程組有唯一解,所以,解出所有的解,只要所有解都非負即可算出答案,如果有負的就impossible。當n為偶數時,i為偶數的方程相加和i為奇數的方程相加的結果應該是一樣的(都等於所有ri之和)。所以先算這兩個和,如果這兩個和不相等,也是impossible。其次,我們從第二個方程起,可以將每個ri都變成與r0相關的式子,這樣,所有圓的面積都可以用r0表示,最後的總面積是關於r0的二次函式,直接求解最小值即可。設ri = ai*r0 + bi,

則r(i + 1) = di - ri = -ai*r0 - bi + di。所以a(i + 1) = -ai,b(i + 1) = - bi + di。a0 = 1,b0 = 0。這樣求出每個ai和bi(可以發現ai只有1和-1),然後面積和 = pi*sigma(ri^2,0 <= i <= n - 1) = a*r0^2 + b*r0 + c,算出a,b,c的值再根據每個ri的範圍(0 <= ri <= min(di,d(i + 1))求出r0的取值範圍(即維護區間的左右端點),如果區間右端點小於左端點,則無解impossible。否則根據二次函式性質算出區間內最低點即可。

題解來自:

HDU 5531 平面幾何 三分

題意是給你n個點,然後要求以每個點為圓心畫乙個圓,使得兩兩相鄰的圓心的圓相切,不相鄰的圓可以相交,如果可以作這樣的圓那麼輸出圓面積和的最小值和,每個圓的半徑,否則輸出impossible。首先我們求出每一條鄰邊的長度,記為l1,l2,l3,ln,假定第乙個圓的半徑為x,那麼我們可以用x表示所有圓的半...

計算幾何求公式

例題1 poj 1380 矩陣的包含 給你兩個矩陣的長和寬,問前面這個矩陣能否包含後面這個矩陣。1 當前面的矩陣的寬 小於後面這個矩陣的寬時,不能包含。2 當前面矩陣的面積 後面矩陣的面積,不能包含。3 當前面矩陣的長,寬 後矩陣的長,寬,能夠包含。4 特別注意前矩陣寬 後矩陣的寬,但是長 後矩陣的...

計算幾何公式總結

一.注意 1.注意捨入方式 0.5的捨入方向 防止輸出 0.2.幾何題注意多測試不對稱資料.3.整數幾何注意xmult和dmult是否會出界 符點幾何注意eps的使用.4.避免使用斜率 注意除數是否會為0.5.公式一定要化簡後再代入.6.判斷同乙個2 pi域內 兩角度差應該是 abs a1 a2 p...