https://cn.vjudge.net/problem/UVA-1473

题目

给出一些点,问包含这些点的最小圆锥(要求顶点在y轴,底面圆心在原点)的体积

题解

因为圆锥对称,所以可以把所有点旋转到xOy平面,然后问题转化成求最小的三角形。

于是我们就可以求出上凸包,然后最小的三角形显然过凸包上的一个或两个点

过一个点的时候可以推公式:

设$A(a,b),H(0,y),C(x,0)$

那么\[\frac{b}{x-a}=\frac{y}{x}\]

\[\pi x^2\times y/3 = C\times \frac{x^3}{x-a}\]

然后求导,得

\[\frac{3x^2(x-a)-x^3}{(x-a)^2}\]

符号只与分子有关

得$x=\frac{3a}{2}$时体积最小,其他时候体积都比这个大,偏得越多越大

然后还要考虑不能和上凸包的边相交

就这样就可以了,然后头晕写了个通过截面面积判断圆锥体积……

AC代码

#include<cstdio>
#include<cmath>
#include<cassert>
#include<algorithm>
#define REP(r,x,y) for(register int r=(x); r<(y); r++)
#define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
#ifdef sahdsg
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...) void(0)
#endif
using namespace std; #define EPS 1e-10
int dcmp(const double &x) {
return fabs(x)<EPS?0:(x<0?-1:1);
}
inline double pf(double x) {
return x*x;
}
#define MAXN 10007
template <class T, int S>
struct array {
int n;
T arr[S];
T& operator[](int i) {return arr[i];}
};
struct dian {
double x,y;
bool operator<(const dian&r) const {
return x>r.x || (dcmp(x-r.x)==0 && y<r.y);
}
bool operator==(const dian&r) const {
return fabs(x-r.x)<EPS && fabs(y-r.y)<EPS;
}
} dots[MAXN], vec; dian operator-(const dian&a, const dian&b) {
return (dian){a.x-b.x,a.y-b.y};
} double Cross(const dian&l, const dian&r) {
return l.x*r.y-l.y*r.x;
} array<dian, MAXN> convex; int main() {
int n;
while(~scanf("%d", &n)) {
double x,y,z;
convex.n=0;
REP(i,0,n) {
scanf("%lf%lf%lf", &x, &y, &z);
dots[i].x=sqrt(pf(x)+pf(y));
dots[i].y=z;
}
sort(dots,dots+n);
n=unique(dots,dots+n)-dots;
REP(i,0,n) {
while(convex.n>=2 && dcmp(Cross(convex[convex.n-1]-convex[convex.n-2],dots[i]-convex[convex.n-2]))<=0) convex.n--;
convex[convex.n++]=dots[i];
}
double ans=2e33;
double r,h;
REP(i,0,convex.n) {
double tr,th,nans;
tr=convex[i].x*1.5; th=convex[i].y*3;
if(i>0 && dcmp(convex[i].y-convex[i-1].y)<=0) break;
if(i>0 && dcmp(Cross(convex[i]-convex[i-1],(dian){-tr,th}))<0) {
tr=Cross(convex[i],convex[i-1])/(convex[i-1].y-convex[i].y),
th=Cross(convex[i],convex[i-1])/(convex[i].x-convex[i-1].x);
}
else if(i<convex.n &&
dcmp(Cross(convex[i+1]-convex[i],(dian){-tr,th}))>0) {
tr=Cross(convex[i+1],convex[i])/(convex[i].y-convex[i+1].y),
th=Cross(convex[i+1],convex[i])/(convex[i+1].x-convex[i].x);
}
nans=tr*tr*th/2;
if(nans>EPS && nans<ans) {
ans=nans; r=tr; h=th;
}
}
printf("%.3f %.3f\n", h,r);
}
return 0;
}

UVA 1473 Dome of Circus的更多相关文章

  1. UVa 1473 - Dome of Circus 三分

    把所有的点都映射到XOZ这个平面的第一象限内,则这个三维问题可以转化二维问题: 求一条直线,使所有点在这条直线的下方,直线与X轴和Z轴围成的三角形旋转形成的圆锥体积最小. 这样转化之后可以看出直线的临 ...

  2. 【凸包】【三分】Gym - 101309D - Dome of Circus

    容易发现,圆锥体积和点的具体x.y坐标无关,只与其到z轴的距离sqrt(x*x+y*y)有关. 于是将这些三维的点都投射到二维的xOy平面的第二象限(sqrt(x*x+y*y),z),求个上凸壳,然后 ...

  3. HDU 3756 Dome of Circus

    不会做,参见别人的程序: /* 底面为xy平面和轴为z轴的圆锥,给定一些点,使得圆锥覆盖所有点并且体积最小 点都可以投射到xz平面,问题转换为确定一条直线(交x,z与正半轴)使得与x的截距r 和与z轴 ...

  4. [HDU3756]Dome of Circus

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

  5. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

  6. hdu3756三分基础题

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

  7. ACM ICPC 2010–2011, Northeastern European Regional Contest St Petersburg – Barnaul – Tashkent – Tbilisi, November 24, 2010

    ACM ICPC 2010–2011, Northeastern European Regional Contest St Petersburg – Barnaul – Tashkent – Tbil ...

  8. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  9. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

随机推荐

  1. MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

    最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...

  2. 龙芯电脑上Electron应用开发

    背景 最近在一台龙芯电脑(系统是中兴新支点,Linux)上开发electron应用. PS:龙芯是国产的cpu,采用是mips架构,类似x86.arm. 安装NodeJS 安装步骤请查看:https: ...

  3. Electron npm install 常见错误(Linux)

    Linux版本 Ubuntu 12.04 (32bit) 安装Git sudo apt-get install git 生成ssh key #查看有没有sshkey cd ~/.ssh #生成 ssh ...

  4. mysql 写入中文乱码

    今天从另一个系统往mysql数据库写入数据,发现中文变成了????? 检查数据库的设置 ,server对应字符集是latinl 调整mysql参数配置,配置文件目录/etc/mysql/mysql.c ...

  5. Linux 文件系统简介(FHS:Filesystem Hierarchy Standard)

    一,linux的目录结构 /bin:所有用户都可以使用的可执行程序 /sbin:系统管理员使用的可执行程序 /boot:引导加载器必须用到的静态文件:kernel,initramfs,grub等. / ...

  6. 表单生成器(Form Builder)之伪造表单数据番外篇——指定范围随机时间

    为了伪造一些尽量真实的假数据,也真是够费劲的.上一篇笔记记录了一下获取一个随机车辆牌照,这篇笔记记录一下怎么获取一个随机时间.这篇就不说那么多废话了,直接上代码 // 获取指定范围的随机数 var g ...

  7. [C]编译器对char数组声明的一个行为

    1概述 如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度.实际上这个数组最后一位被编译器强行加上了\0: #include <std ...

  8. debug查找主板生产日期

    实验环境:XP(XP以上系统没有自带debug) 查询主板生产日期,发现时间为07/02/15 -e命令进行修改日期,尝试将07年改为08年 在查询一下修改完成后的日期,发现日期不变 原因:这块内存是 ...

  9. Java中dimension类详解

    Java中dimension类详解 https://blog.csdn.net/hrw1234567890/article/details/81217788

  10. shell 中长命令的换行处理

    考察下面的脚本: emcc -o ./dist/test.html --shell-file ./tmp.html --source-map-base dist -O3 -g4 --source-ma ...