题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5432
题目大意:
给一些底面为正方形的锥体,现在要给这些锥体来一刀,即给一个平面,使得这些锥体一分为二,上面部分体积为总体积的一半,问这个平面的高度应该为多少。
思路:
二分平面的高度。当体积为总体积的一半时即可跳出。注意有可能平均高度大于个别比较低的锥体,这个时候对这个锥体分割所得的体积就是0.
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define eps 0.0000000001
double V;
int n;
double a[10005],b[10005],h[10005],sum;
double cal(double h,double a,double b)
{
if(h>=a)return 0; //如果当前高度大于这个锥体的高度,就是这个锥体没有被分割,体积就是0.
double ans,d;
d=b*(a-h)/a;
ans=d*d*(a-h)/3;
return ans;
}
double erfen(double l,double r)
{
double x=r;
double d,v,mid;
int f=0;
while(fabs(l-r)>eps)
{
v=0;
mid=(l+r)/2;
for(int i=1;i<=n;i++)
v+=cal(mid,a[i],b[i]); //计算体积
if(fabs(2*v-sum)<eps){
return mid;
}
else if(2*v<sum)r=mid;
else if(2*v>sum)l=mid;
}
return l;
}
int main()
{
int T,i,j,k;
scanf("%d",&T);
while(T--)
{
sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(i=1;i<=n;i++)
scanf("%lf",&b[i]);
for(i=1;i<=n;i++)
{
V=1.0/3*a[i]*b[i]*b[i];
sum+=V; //总体积
}
double x= erfen(0,100000);
printf("%d\n",(int)x); //取整
}
return 0;
}