Cup
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3743 Accepted Submission(s): 1195
Problem Description
The WHU ACM Team has a big cup, with which every member drinks water. Now, we know the volume of the water in the cup, can you tell us it height?
The radius of the cup's top and bottom circle is known, the cup's height is also known.
The radius of the cup's top and bottom circle is known, the cup's height is also known.
Input
The input consists of several test cases. The first line of input contains an integer T, indicating the num of test cases.
Each test case is on a single line, and it consists of four floating point numbers: r, R, H, V, representing the bottom radius, the top radius, the height and the volume of the hot water.
Technical Specification
1. T ≤ 20.
2. 1 ≤ r, R, H ≤ 100; 0 ≤ V ≤ 1000,000,000.
3. r ≤ R.
4. r, R, H, V are separated by ONE whitespace.
5. There is NO empty line between two neighboring cases.
Each test case is on a single line, and it consists of four floating point numbers: r, R, H, V, representing the bottom radius, the top radius, the height and the volume of the hot water.
Technical Specification
1. T ≤ 20.
2. 1 ≤ r, R, H ≤ 100; 0 ≤ V ≤ 1000,000,000.
3. r ≤ R.
4. r, R, H, V are separated by ONE whitespace.
5. There is NO empty line between two neighboring cases.
Output
For each test case, output the height of hot water on a single line. Please round it to six fractional digits.
Sample Input
1 100 100 100 3141562
Sample Output
99.999024
找不到错位的wa!!!
//问题分类:二分解方程,和2199判断方法,1969思路很像,就是公式比较复杂
#include<stdio.h>
#include<math.h>
double pi = acos(-1.0);
//圆台体积:v=pi*h(R*R+R*r+r*r)/3
int getv(double r,double R,double H,double h,double V){
double x=R+h*(r-R)/H;//表示水面的半径
double vv=pi*h*(x*x+x*r+r*r)/3 ;
if(vv<V){
return 0;
}else{
return 1;
}
}
int main(){
freopen("in.txt","r",stdin);
int zu;
while(scanf("%d",&zu)!=EOF){
//r 圆台下半径, R圆台上半径, H圆台高度, V水的体积,h水的高度
while(zu--){
double r, R, H, V,h;
scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
double base=0,top=H,mid;
//在查找时,应使得尾>=头
//对于浮点数来说,判断相等的方法是做差,如果差在很小的范围内,则相等
while(top-base>=1e-10){
mid=(top+base)/2;
//如果范围大了,top缩,范围小,base扩
if(getv(r, R, H,mid,V)==1){
top=mid;
}else{
base=mid;
}
}
printf("%.6lf\n",mid);
}
}
return 0;
}