ZOJ 3015 Collision Ball Game(反射)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3015
——训练时候的一道题,不过没什么人做,看来大家都不太喜欢计算几何= =
题目很容易理解,求小球运动的轨迹长度。如果不给定b这个题还会再有点难度,但是给了b的值就好算很多,但是也导致了不容易自己编数据。
首先这道题我想通过计算平行于x轴的l1的长度和剩下的半段l2的长度之和,算法是通过相似三角形或者直接利用tan的值,不过应该是因为精度损失严重WA了。
然后开始找损失精度小的方法,于是这才意识到为什么都知道反射角了却还要给b值,而后就想到了可以采用“入射角等于反射角”的办法找到(0,a)点关于斜边的对称点(xa,ya),最后用(xa,ya),(xa,0),(b,0)三点组成的三角形的斜边来作为这道题的答案。
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define PI 3.141592653589793238462643383 const double eps=1e-6; int main(){ double k,h,a,b,l1,l2; while(cin>>k>>h>>a>>b){ l1=2*(h-a)/(tan(k*PI/180)+1/tan(k*PI/180)); l2=-tan(k*PI/180)*l1+2*h-a;//l2为(xa,ya)和(xa,0)的距离 l1-=b;//l1为(xa,0)和(b,0)的距离 double l=sqrt(l1*l1+l2*l2); printf("%.2lf\n",l); } return 0; }