FZU 2095 水面高度

 Problem 2095 水面高度

Accept: 40    Submit: 256
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

kk手上有个长方体,三边长AC,AB,AD分别为a,b,c,现在里面的水高度为d(0<=d<=c)。现在kk将长方体沿AB边翻转,当C点的高度为x(0<=x<a)时,求水面高度。

 Input

第一行一个整数T,表示有T(1<=T<=1000)组数据。

每组数据输入五个整数:a b c d x (10<=a,b,c<=100)。

 Output

每组数据输出一行,表示水面高度,结果保留两位小数。

 Sample Input

215 10 20 10 1283 33 26 18 7

 Sample Output


几何题
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

double a,b,c,d,x;
double ans;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
	scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&x);
    if(x==0)
	{
		printf("%.2f\n",d);
	    continue;
	}
	double s=a*d;
	double angle=asin(x/a);
  double sinx=sin(angle);
  double cosx=cos(angle);
	//double cosx=sqrt(1-sinx*sinx);

	double x2=c*cosx;
    double h2=x+x2;
	double l;
	double s1;
	
	if(x<x2)
	{
      l=a/cosx;
	  s1=l*x*0.5;
	  //h2=cosx*c+x;
	}
	else if(x>=x2)
	{
		l=c/sinx;
		s1=l*x2*0.5;
		x=x2;
		//h2=sinx*a+x;
	}
    if(s<=s1)
	{
        double num=s/s1;
		double k=sqrt(num);
		ans=k*x;
	}
	else if(s>s1&&s<=(a*c-s1))
	{
		double s2=s-s1;
		double h=s2/l;
		ans=h+x;
	}
	else
	{
       //double s2=a*c-s1;
	   //double s3=s-s2;
	   double s4=a*c-s;
	   double num=s4/s1;
	   double k=sqrt(num);
	   double h=k*x;
	   ans=h2-h;

	}
	
	printf("%.2f\n",ans);
	}
	return 0;

}


posted @ 2016-05-04 16:18  Shendu.CC  阅读(132)  评论(0编辑  收藏  举报