FZU 2095 水面高度
![](http://acm.fzu.edu.cn/image/problem.gif)
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)时,求水面高度。
![](http://acm.fzu.edu.cn/image/Problem/1240002_fjxx.jpg)
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; }