UVA 12901 Refraction 折射 (物理姿势)

一道数学题,解个2次方程就行了。。。

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

UVA 12901 Refraction 折射 (物理姿势)

做法不唯一,我想避免精度损失所以在化简的时候尽可能得去避免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;

}

 

你可能感兴趣的:(action)