HDU 3756 Dome of Circus 三分

/*
底面为xy平面和轴为z轴的圆锥,给定一些点,使得圆锥覆盖所有点并且体积最小
点都可以投射到xz平面,问题转换为确定一条直线(交x,z与正半轴)使得与x的截距r
和与z轴的截距h满足h*r*r最小。
三分,对于确定的h可以找到最佳的r,并且h*r*r的曲线必定只有一个极小值
*/
struct po
{
    double x,y;
}p[10005];
const double eps=1e-9;
double Y;
int n;
double makeR(double h)
{
    double R=0;
    for(int i=0;i<n;i++)
    {
       //R=max(R,h*p[i].x/(h-p[i].y));
       if(R*(h-p[i].y)<h*p[i].x)
       R=h*p[i].x/(h-p[i].y);
    }
    return R;
}
void solve()
{
    double L=Y,R=1<<30,tmp;
    while(R-L>eps)
    {
         tmp=(R-L)/3.0;
        double mid1=L+tmp;
        double mid2=L+2.0*tmp;
        double R1=makeR(mid1);
        double R2=makeR(mid2);
       // cout<<L<<" "<<R<<endl;
        if(R1*R1*mid1>R2*R2*mid2)
        {
            L=mid1;
        }
        else
        {
            R=mid2;
        }
    }
    printf("%.3lf %.3lf\n",L+eps,makeR(L)+eps);
}
int main()
{
    int i,j,k;
    int ca;
    scanf("%d",&ca);
    while(ca--)
    {
        scanf("%d",&n);
        double tx,ty,Left=0;
        Y=0;
        for(i=0;i<n;i++)
        {
            scanf("%lf%lf%lf",&tx,&ty,&p[i].y);
            p[i].x=sqrt(tx*tx+ty*ty);
            Y=max(p[i].y,Y);
        }
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值