题意:给定三围空间里面某些点,求构造出一个棱锥,将所有点包含,并且棱锥的体积最小。





输入:

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的更多相关文章

  1. hdu3756三分基础题

    Dome of Circus Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. [HDU3756]Dome of Circus

    题目大意: 在一个立体的空间内有n个点(x,y,z),满足z>=0. 现在要你放一个体积尽量小的圆锥,把这些点都包住. 求圆锥的高和底面半径. 思路: 因为圆锥里面是对称的,因此问题很容易可以转 ...

  3. hdu3756(三分)

    题意:三维坐标轴,有以原点为圆心,底面在xoy平面上,顶点在z轴上的圆锥,问圆锥的最小体积为多少才能完全覆盖空间里的所有点(n<=10000) 分析: 很容易想到转成二维问题,将其投影到xoz平 ...

  4. hdu3756 三分求最小圆锥

    题意:       让你找到一个最小的圆柱去覆盖所有的竖直的线段.. 思路:       三分,直接去三分他的半径,因为想下,如果某个半径是最优值,那么 从R(MAX->now->MIN) ...

随机推荐

  1. TP开发小技巧

    TP开发小技巧原文地址http://wp.chenyuanzhao.com/wp/2016/07/23/tp%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7/ ...

  2. C语言基础文件读写操作

    整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...

  3. bzoj1188: [HNOI2007]分裂游戏

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  4. codevs4373 窗口

    题目描述 Description 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: Window position Min val ...

  5. codevs 1107 等价表达式

    传送门 题解:第一眼这题好像非常难得样子,简直没有思路.但是这可以用栈带入特殊值来解决.这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算.当读入的运算符比运算符栈的栈顶元素优先级低时 ...

  6. gnu cc扩展和ABI

    gnc cc扩展标准c的语法,非常强大!!!详情请见: http://uw714doc.sco.com/cgi-bin/info2html?%28gcc.info%29C%2520Extensions ...

  7. 函数部分应用Partial application

    def adder(m:Int,n:Int)=m+n val add2 = adder(2,_:Int) println(add2(3)) val add3 = adder(_:Int,3) prin ...

  8. shell变量自增的几种方式

    #!/bin/sh a= a=$(($a+)) a=$[$a+] a=`` let a++ let a+= ((a++)) echo $a 输出 : 转载自:http://blog.csdn.net/ ...

  9. C#经典系列-键值对

    1.ToDictionary,ToLookup 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,用的是非常非常多 我们有这样的一个实体 class student { publ ...

  10. java笔记7之录入

    1  为了让程序的数据更符合开发的数据,我们就加入了键盘录入.    让程序更灵活一下.        那么,我们如何实现键盘数据的录入呢?        A:导包            格式:   ...