HDu 4793(水の計算ジオメトリ)


タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=4793;
原点に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; }