题意:圆的坐标是(0,0),给它的半径,再给一个范围半径,再给一个硬币的坐标和它的半径,还有他的速度矢量,问这个硬币在给定范围里面待了多久。硬币碰到圆会弹开。这道题直接画图推公式就好了,下面给代码。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
#define maxn 10005
#define xx 1000000001
int main() {
int r1, R, r2, x1, y1, a, b;
while (scanf("%d%d%d%d%d%d%d", &r1, &R, &r2, &x1, &y1, &a, &b) != EOF) {
double d = abs(b*x1 - a*y1) / sqrt(pow(a, 2) + pow(b, 2));//算点到线的距离
if (d >= R + r2) {
printf("0.000\n");
}
else {
double x = x1 + 0.001*a;
double y = y1 + 0.001*b;
if (sqrt(pow(x, 2) + pow(y, 2)) > sqrt(pow(x1, 2) + pow(y1, 2))) {
printf("0.000\n");
continue;
}//如果方向不是靠近原点输出0
if (d >= r1 + r2) {
double re = sqrt(pow(R + r2, 2) - pow(d, 2)) / sqrt(pow(a, 2) + pow(b, 2));
printf("%.3lf\n", re * 2);
}
else {
double re = (sqrt(pow(R + r2, 2) - pow(d, 2)) - sqrt(pow(r1 + r2, 2) - pow(d, 2))) / sqrt(pow(a, 2) + pow(b, 2));
printf("%.3lf\n", re * 2);
}
}
}
}