HDU3756
题意:给定三围空间里面某些点,求构造出一个棱锥,将所有点包含,并且棱锥的体积最小。
输入:
T(测试数据组数)
n(给定点的个数)
a,b,c(对应xyz坐标值)
.
.
.
输出:
H(构造棱锥的高)
R(构造棱锥的半径)
思路:
简单的一次求导极值问题,首先将三围虚拟化成二维,可以这样想,以棱锥的高为三角形的高,棱锥的里面半径为三角形的底边,所以可以理解为要求棱锥的最小体积,即V=π*H*R^r/3最小,在虚拟的二维三角形里面,斜边长你可以假设其中的某个点为(a,b),斜率为k,那么斜边方程就知道,利用x=0,y=0两个特殊值,可以解出H和R,代入V里面,求一阶导,得出
-π*(aK^2+2bK)*(aK-b)^2 /K^2 ,所以利用单调性可以判断K=-2b/a时有极值,然后利用三分求极值枚举R,给个三分求极值的解释我是链接 ,之后求出最小的H即可。
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std; #define PI acos(-1.0) struct P
{
double x;
double y;
double z;
double r;
}; P point[10001];
int n;
double r,z,ans; double cal(double R)
{
int i;
double max = 0;
for(i = 0; i < n; i ++)
{
double nz = point[i].z/(R - point[i].r);
if(max < nz)max = nz;
}
return max * R;
} double ss()//三分枚举确定极值
{
double right = 2*1e4, left = r, ml, mr;
while(right - left > 1e-4)
{
ml = (right + 2*left)/3.0;
mr = (left + 2*right)/3.0;
double lans = cal(ml)*ml*ml;
double rans = cal(mr)*mr*mr;
if(lans < rans)right = mr;
else left = ml;
}
ans = (right + left)/2.0;
//cout<<ans<<endl;
return ans;
} int main()
{
int t;
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
r = z = 0;
for(i = 0; i < n; i ++)
{
scanf("%lf%lf%lf",&point[i].x,&point[i].y,&point[i].z);
point[i].r = sqrt(point[i].x * point[i].x + point[i].y * point[i].y);
if(r < point[i].r)r = point[i].r;
if(z < point[i].z)z = point[i].z;
}
double flag = ss();
printf("%.3lf %.3lf\n",cal(flag),flag);
}
return 0;
}
HDU3756的更多相关文章
- hdu3756三分基础题
Dome of Circus Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- [HDU3756]Dome of Circus
题目大意: 在一个立体的空间内有n个点(x,y,z),满足z>=0. 现在要你放一个体积尽量小的圆锥,把这些点都包住. 求圆锥的高和底面半径. 思路: 因为圆锥里面是对称的,因此问题很容易可以转 ...
- hdu3756(三分)
题意:三维坐标轴,有以原点为圆心,底面在xoy平面上,顶点在z轴上的圆锥,问圆锥的最小体积为多少才能完全覆盖空间里的所有点(n<=10000) 分析: 很容易想到转成二维问题,将其投影到xoz平 ...
- hdu3756 三分求最小圆锥
题意: 让你找到一个最小的圆柱去覆盖所有的竖直的线段.. 思路: 三分,直接去三分他的半径,因为想下,如果某个半径是最优值,那么 从R(MAX->now->MIN) ...
随机推荐
- android 调用系统相机
// 调用相机拍照的请求码 public static final int REQUEST_TAKE_PHOTO_CODE = 1; public static final int REQUEST_T ...
- PHP分页详细讲解
网上有好多PHP分页的类,但我们要弄明白PHP分页原理才可以学到知识,今天我就带你学制作PHP分页. 1.前言分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之 ...
- twisted(1)--何为异步
早就想写一篇文章,整体介绍python的2个异步库,twisted和tornado.我们在开发python的tcpserver时候,通常只会用3个库,twisted.tornado和gevent,其中 ...
- springmvc基于xml配置文件
web.xml 配置文件 <!-- springmvc 配置入口 --> <servlet> <servlet-name>mvc-dispatcher</se ...
- Ultra UltraEdit中取消提示:你要转换 File 为 DOS 格式吗?
Ultra Edit中取消提示:文件可能不是DOS格式,你要转换 File 为 DOS 格式吗? UE 提示 取消取消这个提示: 高级 -> 配置 -> 文件处理 -> DOS/UN ...
- 7.5 Point-in-Time (Incremental) Recovery Using the Binary Log 使用binay log 基于时间点恢复
7.5 Point-in-Time (Incremental) Recovery Using the Binary Log 使用binay log 基于时间点恢复 7.5.1 Point-in-Tim ...
- List<T> 和DataTable的相互转换
我用的将集合类转换为DataTable 的方法 /// <summary> /// 将集合类转换成DataTable /// </summary> /// <param ...
- delphi读写文本文件
delphi读写文本文件 在工作中遇到了这样一个问题,使用PLSQL将一个表的数据转化成一些列的insert语句存储到一个.sql文本中,我本来想使用access数据库中的查询视图一次执行这些语句 ...
- Android中bitmap的相关处理
加载大图片 Options options=new Options(); options.inJustDecodeBounds=true;//不加载图片,只加载文件信息 //加载图片,获取到配置信息 ...
- shell中条件判断if中的-z到-d的意思【转载】
本文转载自[http://blog.csdn.net/utstarm/article/details/6536916] [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] ...