【题解】东哥的杯子
【题目描述】
话说在一场牛客练习赛中,东哥力压群雄,挣得第一,牛客为了奖励东哥的发挥,送他一个马克杯。奖励的马克杯是一个标准的
圆台形状,它的上底为R1,下底为R2,高为H, 东哥向杯子里倒V毫升的水,你知道倒完水后,杯子里的水位有多高吗?
【输入描述】
多组数据
每组数据只有一行,为R1(1<=R1<=10,000),R2(1<=R2<=100,000), H(1<=H<=100,000),V(1<=V<=1000,000,000)。
【输出描述】
输出倒完水后的杯子的水位高,结果保留三位小数
【样例输入】
10 100 10 1000 1 1 1 10
【样例输出】
1.250 1.000
【公式】
r为上底半径、R为下底半径、h为高。
【题目分析】
【参考答案】
#include<bits/stdc++.h> using namespace std; const double EPS=1e-9; const double pi=acos(-1.0);//得到π的值 double r1,r2,h,v; bool check (double x) { double R=1.0*r1+(r2-r1)*x/h; return 1.0/3*pi*x*(r1*r1+R*R+r1*R)<v; } int main() { while(cin>>r1>>r2>>h>>v) { double V=1.0/3*pi*h*(r1*r1+r2*r2+r1*r2); if(v>=V) { printf("%.3lf\n",h); continue; } double l=0,r=100*1.0,mid; while(r-l>EPS) { mid=(l+r)/2.0; if(check(mid)) l=mid+EPS; else r=mid-EPS; } printf("%.3lf\n",(l+r)/2.0); } return 0; }
(adsbygoogle = window.adsbygoogle || []).push({});