HDU 3756 Dome of Circus 三分
来源:互联网 发布:淘宝进店提醒 编辑:程序博客网 时间:2024/04/30 18:48
/*底面为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;}