2015-04-13 21:52:25
思路:japan 2009 的題... (japan果然老喜歡幾何了...- -)
題意很精簡,在乙個三角形內嵌入三個圓,每個角對應乙個圓。已知三角形三個點的座標,求三個圓的半徑。
蒟蒻不會.. 看的紅書的思路...
※我們可以二分列舉乙個圓的半徑 r1,然後根據下圖,可以列出方程:
r1/tanα + r2/tanβ + sqrt((r1+r2)^2 - (r1-r2)^2) = ab
可以二分一下 r2 來求出 r2,同理可以求出 r3。然後把求出的 r2,r3 帶入類似的方程,
判斷其 > bc 還是 < bc,若小於說明r2,r3過小,r1應該縮小;若大於說明r2,r3過大,r1應該擴大。
當然有直接數學推出公式的方法... 蒟蒻還不會... 待補!~
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include8 #include 9 #include 10 #include
11 #include 12 #include 13
using
namespace
std;
1415
#define mem(a,b) memset(a,b,sizeof(a))
16#define rep(i,n) for(int i=0;i
17#define for(i,a,b) for(int i=(a);i<=(b);++i)
18#define getmid(l,r) ((l) + ((r) - (l)) / 2)
19#define mp(a,b) make_pair(a,b)
2021 typedef long
long
ll;22 typedef pairpii;
23const
int inf = (1
<< 30) - 1;24
const
double eps = 1e-12;25
const
double pi = acos(-1.0
);26
27double
x1,y1,x2,y2,x3,y3;
28double
ab,bc,ac,r1,r2,r3;
29double
a,b,c,tha,thb,thc;
3031
double dis(double a1,double b1,double a2,double
b2)34
35double sign(double
v)39
40void
pre()
4849
double f(double ra,double ta,double rb,double tb,double
l)52
53bool judge(double v)
61 r2 =l;
62 l = 0.0,r = 2000.0;63
while(sign(r - l) != 0
)68 r3 =l;
69if(sign(f(r2,thb,r3,thc,bc)) < 0) return
false;70
return
true;71
}7273int
main()
86 printf("
%.6f %.6f %.6f\n
",r1,r2,r3);87}
88return0;
89 }
POJ2002 Squares 計算幾何,二分
給定一堆點,求這些點裡哪些點可以構成正方形,題目給定n 1000,直接列舉四個點是肯定會超時的,因此要做一些優化。有公式,已知兩個點在正方形對角,分別是 x1,y1 和 x2,y2 那麼圍成正方形後另外兩個點 x3,y3 和 x4,y4 分別為 x3 x2 x2 y1 y3 x2 x2 x1 x4 ...
發財兔幾何 二分
題目描述 小明非常喜歡計算幾何,有一天他突發奇想,從x正半軸和y正半軸上分別選了n個點,他按照某種順序把兩邊的點一一對應連起來,構成了n個線段,其中要保證任意兩個線段是不相交的。後來小明又提出了q個問題,每個問題給出乙個點p x,y 我們想要知道op線段和多少小明連起來的那n個線段有交點。o為原點 ...
poj 3685 二分套二分
題意 給乙個n n 的矩陣,其中每個元素的大小為 i i 100000 i j j 100000 j i j 現在給n和m,求這個矩陣中第 m 大的元素是什麼。解析 發現上面那個式子是按照,每一列,從小到大遞增的。所以可以先二分設定乙個mi元素,然後按照每一列來二分統計比它小的元素有多少個。如果比它...