题意:有一个小球向一个圆飞去,碰到这个圆会反弹,问在另一个大圆内停留的时间。
分类讨论,然后分别推公式。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps = 1e-8;
double Rm, R, r, x, y, vx, vy;
int main()
{
while (scanf("%lf %lf %lf %lf %lf %lf %lf", &Rm, &R, &r, &x, &y, &vx, &vy) != EOF)
{
double v = sqrt(vx * vx + vy * vy);
if (x * vx + y * vy >= eps)
{
printf("0\n");
continue;
}
double k, bb, a, b, c, dis;
if (vx)
{
k = vy / vx;
bb = y - k * x;
a = k, b = -1, c = bb;
}
else
a = 1, b = 0, c = -x;
dis = fabs(c) / sqrt(a * a + b * b);
if (dis >= R + r)
{
printf("0\n");
continue;
}
if (dis >= Rm + r)
{
double ans = 2.0 * sqrt((R + r) * (R + r) - dis * dis);
printf("%.3f\n", ans / v);
continue;
}
double ans = 2.0 * (sqrt((R + r) * (R + r) - dis * dis) - sqrt((Rm + r) * (Rm + r) - dis * dis));
printf("%.3f\n", ans / v);
}
return 0;
}