hdu 4793(嗷嗷水的计算几何)

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值