HDu 4793(水の計算ジオメトリ)
1527 ワード
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=4793;
原点に1つのプラットフォームがあって、原点にもう1つの円形の木の塊があって、障壁と見なして、1つの円形のスライダが滑らかな座標軸の上で摩擦して、初期の位置と座標軸の方向の分速度があって、求めて、円形のプラットフォームの上でどのくらい歩きます.
分析:
本題で求めたのは、円形スライダトラックのうち2回と円形プラットフォームの外接との間の時間であり、円形座標トラック(x+vx*t,y+vy*t)を用いて正接を計算する時刻であり、バッフルにぶつかると円形プラットフォームの1回目の外接とバッフルに接する時の時間差の2倍である.
コードは次のとおりです.
原点に1つのプラットフォームがあって、原点にもう1つの円形の木の塊があって、障壁と見なして、1つの円形のスライダが滑らかな座標軸の上で摩擦して、初期の位置と座標軸の方向の分速度があって、求めて、円形のプラットフォームの上でどのくらい歩きます.
分析:
本題で求めたのは、円形スライダトラックのうち2回と円形プラットフォームの外接との間の時間であり、円形座標トラック(x+vx*t,y+vy*t)を用いて正接を計算する時刻であり、バッフルにぶつかると円形プラットフォームの1回目の外接とバッフルに接する時の時間差の2倍である.
コードは次のとおりです.
#include
#include
#include
#include
#include
#include
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
",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
",(t3-t1)*2);
}
else puts("0.000");
}
return 0;
}