UVA 12901 Refraction 折射 (物理)

一道物理题,解个2次方程就行了。。。

求h最小的情况对应如下图所示

做法不唯一,我想避免精度损失所以在化简的时候尽可能地去避免sqrt和浮点数乘除。

似乎精度要求很低,直接用角度算也可以

#include<cstdio>
#include<cmath>

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int W,H,x,xe,ye;
        double u;
        scanf("%d%d%d%d%d%lf",&W,&H,&x,&xe,&ye,&u);
        int Y = ye - H, X = xe - W;
        int C = X*ye-Y*(xe-x);
        int X2 = X*X, Y2 = Y*Y;
        double lamda = (u*u)*(X2+Y2) - X2;
        double a = (lamda - Y2)*X2;
        double b = -2*X*lamda*C;
        double c = lamda*C*C;
        double delta = b*b - 4*a*c;
        if(delta>=0){
            double h = (sqrt(delta) - b)/(2*a);
            if(h>H) printf("Impossible\n");
            else {
                if(h < 0) printf("0\n");
                else printf("%.4lf\n",h);
            }
        }else {
            printf("Impossible\n");
        }
    }

    return 0;
}

 

posted @ 2015-07-16 20:26  陈瑞宇  阅读(354)  评论(1编辑  收藏  举报