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) ...
随机推荐
- js 判断url的?后参数是否包含某个字符串
function GetQueryString(name){ var reg=eval("/"+name+"/g"); var r = window. ...
- canvas新属性
lineCap默认值是butt,还有aquare,round 使用:context.lineCap="butt" lineJoin miter是默认 还可以是round,bevel ...
- JQuery中$.ajax()方法参数
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- Python文件处理之文件指针(四)
当我们读取文件内容时,并不能重复的读取,比如一个blogCblog.txt文件里有blogCblog内容,用两个read()方法读取blogCblog.txt的内容,会发现,第一个返回文件内容,第二个 ...
- Python读取Excel数据
今天一同学给我发来一个Excel文件,让我帮他找一些信息,打开一开 8000多条数据.自己手工处理是不可能完成的的啦.作为一名程序员,当然要用程序来处理.处理生活中的问题当然是Python最为方便啦. ...
- angular2 学习笔记 ( Form 表单 )
refer : https://angular.cn/docs/ts/latest/guide/forms.html https://angular.cn/docs/ts/latest/cookboo ...
- Asteroids
http://poj.org/problem?id=3041 #include<cstdio> #include<cstring> #include<algorithm& ...
- 最大流Dinic
不断用BFS构造分层网络,用DFS增广.中途用取指的cur优化DFS. Dinic封装模板: #include <cstdio> #include <iostream> #in ...
- BZOJ1642: [Usaco2007 Nov]Milking Time 挤奶时间
1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 525 Solved: 30 ...
- CentOS 6.4 安装 Fcitx4.0
一.首先安装中文支持: su root yum install "@Chinese Support" exit yum remove ibus 注销再登陆 二.安装fcitx 下载 ...