题意:
任取两枚硬币固定在二维平面上,并让它们恰好相切,用第三枚硬币沿着它们形成的边界进行翻滚,即时刻保证与至少一枚已固定的硬币相切。这样这枚运动的硬币在翻滚了一定的圈数之后,一定会回到原点,即恰好绕了一周。(如此一来,便会出现三种情况:固定 A,B,让 C 运动;固定 A,C,让 B 运动;固定 B,C,让 A 运动)
求出运动的硬币翻滚的圈数最少是多少
分析:
绕半径最小的两个圆旋转一定最小,重点是求弧长(余弦定理已经忘完了,去百度了一下)
求出角度后就好算了~~
Code
void solve()
{
cin >> r[1] >> r[2] >> r[3];
sort(r + 1, r + 4);
a = r[1] + r[2], b = r[1] + r[3], c = r[2] + r[3];
double x, y;
x = acosl((a * a + c * c - b * b) / (2.0l * a * c));
y = acosl((a * a + b * b - c * c) / (2.0l * a * b));
res = ((PI - x) * c + (PI - y) * b) / (PI * r[3]);
cout << fixed << setprecision(20) << res << endl;
}
标签:PI,硬币,翻滚,times,固定,pi
From: https://www.cnblogs.com/Aidan347/p/17113592.html