HDU 3756 还是三分
2012-08-29 00:26
190 查看
这题虽然是三维空间,但完全可以转换到一个平面XZ考虑,Z轴不变,X轴是 根号下X*X+Y*Y
问题等价于求最小的三角形覆盖平面上所有的点,必然至少有一点在斜边上
设斜边的斜率为K,一点为(a,b)
则斜边方程为 y=k*(x-a)+b;
h=-a*k+b;
r=-b/k+a;
得到体积的方程,并证明是是凸性,有最小值
这时候我们就可以通过三分枚举一个变量,计算得到一个最小的另一个变量
假设H已知, 则R=a*h/(b-h) 最终求得答案
问题等价于求最小的三角形覆盖平面上所有的点,必然至少有一点在斜边上
设斜边的斜率为K,一点为(a,b)
则斜边方程为 y=k*(x-a)+b;
h=-a*k+b;
r=-b/k+a;
得到体积的方程,并证明是是凸性,有最小值
这时候我们就可以通过三分枚举一个变量,计算得到一个最小的另一个变量
假设H已知, 则R=a*h/(b-h) 最终求得答案
#include<math.h> #include<string.h> #include<stdio.h> #define eps 1e-8 #define maxn 10010 struct point { double x,z; }p[maxn]; int n; double maxx(double a,double b) { return a>b?a:b; } double getR(double h) { double r=0.0; int i; for(i=0;i<n;i++) r=maxx(r,p[i].x*h/(h-p[i].z)); return r; } int main() { while( scanf("%d",&n)==1) { double x,y,z; double h0=0.0; int i,j; for(i=0;i<n;i++) { scanf("%lf%lf%lf",&x,&y,&z); p[i].x=sqrt(x*x+y*y); p[i].z=z; h0=maxx(h0,p[i].z); } double l=h0+eps,r=1e6,mid,midmid; while(r-l>eps) { mid=(l+r)/2.0; midmid=(mid+r)/2.0; double r1=getR(mid); double r2=getR(midmid); if(r1*r1*mid<r2*r2*midmid) r=midmid; else l=mid; } printf("%.3lf %.3lf\n",l,getR(l)); } return 0; }
相关文章推荐
- hdu 3756 || Dome of Circus || 2010 Northeastern European Regional Contest(三分)
- HDU 3756 三分
- HDU 3756 Dome of Circus 三分
- hdu 3756 Dome of Circus(三分)
- HDU 3756 Dome of Circus (三分)
- HDU 3756 Dome of Circus 三分
- HDU 3756 Dome of Circus(计算几何 + 三分)
- hdu 3756 三分 Dome of Circus
- hdu 3756 Dome of Circus 三分
- hdu 3756 Dome of Circus 三分
- HDU 5952 Counting Cliques(我对暴力的理解还是不狗)
- hdu 1233 还是畅通工程 (最小生成树)
- HDU 4454 Stealing a Cake (三分)
- HDU 4717 The Moving Points (三分 模板)
- Hdu 2899 Strange fuction(二分三分可做,模拟退火解法)
- hdu 2899 Strange fuction(用三分即可 不用求导)
- HDU 1233 还是畅通工程
- HDU 1233 还是畅通工程
- HDU 3853 LOOPS 概率第一题 水题,还是被坑了很久
- hdu 1233 还是畅通工程