题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793;
大意:在原点有一个平台,原点还有一个圆形木块,视为挡板,有一个圆形滑块在光滑坐标轴上摩擦,有初始位置和坐标轴方向分速度,求,在圆形平台上走多远。
分析:
本题所求是圆形滑块轨迹中两次与圆形平台外切之间的时间,利用圆形坐标轨迹(x+vx*t,y+vy*t)进行计算相切是的时刻,如果碰上挡板,则用时是与圆形平台第一次外切和与挡板相切时的时间差的二倍。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int Rm,R,r,x,y,vx,vy;
int main(){
while(scanf("%d%d%d%d%d%d%d",&R,&Rm,&r,&x,&y,&vx,&vy)!=EOF){
double a=vx*vx+vy*vy;
double b=2*vx*x+2*vy*y;
double c=x*x+y*y-(Rm+r)*(Rm+r);
if((b*b-4*a*c)<=0){
puts("0.000");
continue;
}
double dert=sqrt(b*b-4*a*c);
double t1=min((-b+dert)/(2*a),(-b-dert)/(2*a));
double t2=max((-b+dert)/(2*a),(-b-dert)/(2*a));
if(t1<0||t2<0){
puts("0.000");
continue;
}
c=x*x+y*y-(r+R)*(r+R);
if((b*b-4*a*c)<0){
printf("%.3f\n",t2-t1);
continue;
}
double der=sqrt(b*b-4*a*c);
double t3=min((-b+der)/(2*a),(-b-der)/(2*a));
if(t3>=0){
printf("%.3f\n",(t3-t1)*2);
}
else puts("0.000");
}
return 0;
}