ZOJ 3015 Collision Ball Game(反射)

来源:互联网 发布:淘宝卖家评价语大全 编辑:程序博客网 时间:2024/05/03 00:14

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



0 0
原创粉丝点击