题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793

解题报告:在一个平面上有一个圆形medal,半径为Rm,圆心为(0,0),同时有一个圆形范围圆心也是(0,0),半径为R,R > Rm,现在向平面上投掷一枚硬币,硬币初始的圆心位置为(x,y),半径是r,给出硬币的速度向量,硬币碰到medal的时候会反射,注意,反射就是原路返回,并不是按照常理的按照圆心连线的路线,表示一直以为是这样,WA了很久,然后,让你求硬币跟圆形范围有交集的时候的总时间是多少。

首先,过原点,作一条与速度向量平行的直线l,然后求出(x,y)到直线l的距离D,然后通过一系列勾股定理就可以求出路程。值得注意的就是有几种情况要特判。

第一,速度的方向跟(x,y)与原点的连线的向量的夹角是不是[0,90)的范围,然后满足这个条件之后还要判断,当D > R+r时,硬币会直接过去而不会经过圆形范围,所以时间直接是0,当Rm+r < D < R+r时,硬币会经过圆形范围,但不会跟medal有碰撞,当D < Rm+r时,硬币跟medal有碰撞。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps = 1e-,PI = acos(-1.0); struct point
{
double x,y;
point(double x = ,double y = ) :x(x),y(y){}
double len()
{
return sqrt(x*x+y*y+eps);
}
};
inline double dis(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+eps);
}
double get_dis(point v,point p)
{
if(fabs(v.x*p.y - p.x*v.y) < eps) return ;
double si = (v.x*p.y-p.x*v.y)/dis(point(,),v)/p.len();
return p.len() * fabs(si);
}
int judge(point p,point v)
{
point temp;
temp.x = - * p.x;
temp.y = - * p.y;
return (temp.x*v.x+temp.y*v.y < ) || (fabs(temp.x*v.x+temp.y*v.y) <eps);
}
int main()
{
// freopen("in.txt","r",stdin);
double Rm,R,r;
point p,v;
while(scanf("%lf%lf%lf%lf%lf%lf%lf",&Rm,&R,&r,&p.x,&p.y,&v.x,&v.y)!=EOF)
{
if(judge(p,v))
{
printf("0.0000\n");
continue;
}
double V = v.len();
double D = get_dis(v,p); //得到硬币到过原点的运动路线的距离
// printf("%.3lf\n",D);
double ans = ;
if(D < Rm+r) //会碰撞,坑,这种情况下题目的反射违反了常理,一直wa在这里
{
double l = sqrt((R+r)*(R+r)-D*D+eps) - sqrt((Rm+r)*(Rm+r)-D*D+eps); //进入圈开始到碰撞走过的距离
ans += (l / V);
// ans += (R - Rm) / V;
}
else if(D > Rm+r && D < R + r)
{
double t = sqrt((R+r)*(R+r) - D*D+eps) / V;
}
else //不会进入圆形范围
{
printf("0.00000\n");
continue;
}
printf("%lf\n",*ans+eps);
}
return ;
}

最新文章

  1. JavaScript(js)的replace问题的解决
  2. html中input文本框,初始里边有文字提示,当点击时,文字消失,怎么设置?
  3. Sprint第二个冲刺(第十三天)
  4. 使用 Aircrack-ng 破解 WEP 和 WPA/WPA2 加密的 Wi-Fi 密码。(转)
  5. linux下svn命令大全
  6. HDMI的CEC是如何控制外围互联设备的
  7. iOS开发如何实现消息推送机制
  8. mysql中的去除空格函数
  9. Hadoop集群基准测试
  10. gdal和python在windows上的安装
  11. WIN32 根据程序名(映像名称)终止外部程序
  12. HDU 4793 2013 Changsha Regional Collision[简单的平面几何]
  13. AutoLayout没有相对比例布局
  14. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)
  15. .net Mvc框架原理
  16. asyncio 基础用法
  17. 浅析JavaScript工厂模式
  18. Tomcat安装、配置和部署笔记
  19. 一个简单的将Markdown二级标题进行排序的脚本
  20. BZOJ2152[国家集训队]聪聪可可——点分治

热门文章

  1. JavaWeb---总结(七)HttpServletResponse对象(一)
  2. MFC学习-第一课 MFC运行机制
  3. Linux 的cp命令详解
  4. Windows7-32bit系统安装MySQL-5.5.39-win32.msi服务图解
  5. 脚本放在 &lt;body&gt; 元素的底部
  6. 用arp-scan扫描局域网IP地址
  7. 20145212 《Java程序设计》第9周学习总结
  8. header的安全配置指南
  9. Cloudservice程序设置Idle timeout
  10. 在VS2013中强制IIS Express应用程序池使用经典模式