本以为二分的题嘛,有了模板一切都好说,这道题发出来其实有抄袭的嫌疑,算是给自己写的纠正性文章了,原来的想法每次二分的条件是相似边比的立方大于体积比,后来发现计算多误差大,然后就变成了所求水的体积大于实际水的体积,结果因为强行套模板,还是错55555.。。所以模板不是看懂会用就行了,还是要懂其中的思想啊。。。
WA:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;//G()h下所求水的体积是否大于实际值
#define pi acos(-1.0)
#define INF 0x7fffffff
bool G(double r,double R,double H,double h,double v)
{
double rr=h*(R-r)/H+r;
if(pi/3*h*(rr*rr+r*r+rr*r)-v>=1e-9)
return 1;
else
return 0;
}
int main()
{
int t;
double r,R,H,V;
double bli;
double lef=0,rig=INF,mid;
scanf("%d",&t);
while(t--)
{
scanf("%lf %lf %lf %lf",&r,&R,&H,&V);
while(rig-lef>1e-9)
{
mid=(lef+rig)/2;
if(!G(r,R,H,mid,V)) lef=mid;
else rig=mid;
}
//cout<<rig<<endl;
printf("%.6lf\n",floor(mid*1000000)/1000000);
}
return 0;
}
大神AC:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define PI acos(-1.0)
#define exp 1e-9
double solve(double r,double R,double h,double H)
{
double u = h/H*(R-r) + r;
return PI/3*(r*r+r*u+u*u)*h;
}
int main()
{
int t;
double r,R,H,V,mid,vv,f,l;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
f=0;
l=100;
while(l-f>exp)
{
mid=(l+f)/2;
vv=solve(r,R,mid,H);
if(fabs(vv-V)<=exp)
break;
else if(vv>V)
l=mid-exp;
else
f=mid+exp;
}
printf("%.6lf\n",mid);
}
return 0;
}