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) ...
随机推荐
- 解决 Ubuntu15.04 登陆界面无限循环 的问题
本人新手,在学习linux 安装NVIDIA 驱动的时候出现了一个奇怪的问题:登陆界面输入正确的账户密码,短暂闪烁后又返回了登陆界面.经查阅多种资料,已解决此问题 以下内容来自:http://blog ...
- 13_FCITX输入法安装及问题排查解决
使用linux最沮丧的事情莫过于中文输入法切换不出来,甚至有人错误地认为,要使用中文输入法,必须把“区域和语言”(Region & Language)设置为中国-中文.输入法只是一个软件,和区 ...
- jquery mobile navbar
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- jQuery中事件的学习
刚学习了jQuery中的事件,主要通过bind(),toggle(),hover()来主要实现,下面先说一说关于bind的想关要点. 1.bind方法. bind方法的主要参数为bind(type,f ...
- 无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。
无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘 ...
- spring注解机制和XML配置机制之间的比较
XML配置的优缺点: 优点有:1. XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译.2. 在处理大的业务量的时候,用XML配置应该更加好一 ...
- 用Javascript的for循环输出质数
<body> <script type="text/javascript"> for(i=2;i<=300;i++){ var prime = tru ...
- 去除win8.1这台电脑中的6个库文件夹
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace,备份之后删除 wi ...
- 开发者应该避免使用的6个Java功能(转)
本文作者是一名拥有多年Java开发经验的程序员,他从经验中得出,并不是所有的Java SE功能/API都值得程序员去使用,比如本文列举的这6个,大家在使用前得慎重对待.以下是对原文的摘译. 多年的Ja ...
- 为什么同时需要IP地址和MAC地址
每个以太网设备在出厂时都有一个唯一的MAC地址,为什么还需要为每台主机再分配一个IP地址?或者说每台主机都分配唯一的IP地址,为什么还要在网络设备(如网卡,集线器,路由器等)生产时内嵌一个唯一的MAC ...