题目大意:T组数据,有每组数据有n个椎体,以下2行分别时n个椎体的高和宽.
求解横着切椎体使得切得的所有的椎体上下两部分的体积相同.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define LL long long
#define esp 1e9
using namespace std;
double h[100010],k[100010],v[100010];
double s;
int n;
double bin_s(double l,double r)
{
int a=l,b=r;//二分的时候为了避免精度的影响直接去掉小数
double mid;
while(a!=b)
{
double sum=0;
mid=(l+r)/2;
for(int i=0;i<n;i++)
{
double p;
p=h[i]-mid;//默认为锥的上部分
if(p>0)
{
double l=(p/h[i])*k[i];
sum+=l*l*p/3;
}
}
if(sum*2<s)//尚若上部的体积*2<总的体积说明下边的部分体积大
{
r=mid;//故使得边界向下可以来增大其体积
}
else
l=mid;
a=l;
b=r;
}
return mid;
}
int main()
{
int m,i,j;
int cla;
scanf("%d",&cla);
while(cla--)
{
double maximum=0;
s=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf",&h[i]);
maximum=max(h[i],maximum);
}
for(i=0;i<n;i++)
{
scanf("%lf",&k[i]);
v[i]=(k[i]*k[i]*h[i])/3;
s+=v[i];
}
printf("%d\n",(int)bin_s(0,maximum));
}
return 0;
}
锥体切割问题
本文解决了一个数学几何问题:如何水平切割一组锥体,使每个锥体的上下两部分体积相等。采用二分查找法确定合适的切割高度。
303

被折叠的 条评论
为什么被折叠?



