题目名称 63. [HNOI 2004] 金属包裹
输入输出 enwrap.in/out
难度等级 ★★★★★
时间限制 3000 ms (3 s)
内存限制 512 MiB
测试数据 11
题目来源 GravatarBYVoid 于2008-07-11加入
开放分组 全部用户
提交状态
分类标签
计算几何 凸包
分享题解
通过:61, 提交:299, 通过率:20.4%
Gravatar_Itachi 100 0.001 s 0.03 MiB C++
Gravatar真呆菌 100 0.006 s 1.55 MiB C++
Gravatarzhengtn03 100 0.007 s 0.38 MiB C++
GravatarHale 100 0.011 s 17.58 MiB C++
Gravatar6+1 100 0.025 s 1.08 MiB C++
Gravatarzhengtn03 100 0.027 s 0.35 MiB C++
Gravatarxxz 100 0.033 s 3.59 MiB C++
GravatarFoolMike 100 0.040 s 0.51 MiB C++
Gravatar粘粘自喜 100 0.040 s 1.20 MiB C++
Gravatar可以的. 100 0.041 s 0.29 MiB C++
关于 金属包裹 的近10条评论(全部评论)
第十个点出现了所有点共面的情况,请小心!
GravatarFoolMike
2017-08-24 17:42 12楼
先吐槽自己把减号重载错了WA无数次...
再想吐槽为毛把精度设成1e-15或者1e-20就过不了,设成1e-10就过了??!!
Gravatar_Itachi
2017-03-24 20:02 11楼
GravatarGo灬Fire
2017-02-26 08:45 10楼
%%%
GravatarAntiLeaf
2016-08-28 15:32 9楼
额..写完了才发现自己写的是求最小体积的三维凸包...
Gravatar_Itachi
2016-08-28 15:08 8楼
我就占楼玩,忽略我
GravatarNVIDIA
2016-03-28 19:46 7楼
重新写了卷包裹法把O(n^4)优化到了O(nh),h为三维凸包上的顶点数,但被精度卡了一万次。。。。。
GravatarSatoshi
2015-10-19 16:20 6楼
回复 @cstdio : 会不会是这里scanf比cin慢
GravatarSatoshi
2015-03-07 22:17 5楼
尼玛,明明是一模一样的算法我写出来就是最慢的那个……
Gravatarcstdio
2015-03-06 08:14 4楼
法向量,真是个强大的东西。
几乎可以解决空间中的一切问题。
从点点距离,点面距离,线线距离,面面距离,线面角,二面角,异面直线所成角,四点三棱锥体积,都是渣渣。
再加上行列式和平面方程的辅助。只要有坐标,就几乎没有法向量解决不了的问题。
----------------------------------------------------------------------------------------------------华丽丽的分割线
坑爹的这题,还要使点发生微量波动,否则就容易出现共面的点,面积计算重复(本来不知道如何解决
共面问题,搜索大神QhelDIV的题解才解决这个问题,在此本蒟蒻膜拜神犇)
可以用随机函数实现
三角形面积用向量叉乘(等于叉乘1/2)解决
三角形面积的2倍等于两个向量的叉乘向量(a,b,c), 而这个向量等价于行列式
\[
{\bf{A}} = \left(\begin{array}{lll}
i & j & k\\
x2-x1 & y2-y1 & z2-z1\\
x3-x1 & y3-y1 & z3-z1\\
\end{array}\right)\]
若求出该向量的表达式为ai+bj+ck;
则该向量的模的一半即为三角形的面积S=0.5*sqrt(a^2+b^2+c^2);
判断金属最外层的表面方法一:QhelDIV光神法
建立三个点的两个向量的叉乘
求出(叉乘向量),将其他的点和这三个点中任意一个点做一条向量,求该向量与叉乘向量的数量积,如果全部都是正数或负数
则说明其他的点都在这三个点组成平面的一侧,则该三个点就是最外层之一
我的原创方法二:
直接求出三角形三个点的平面方程,若其他的点(x,y,z),令S=(Ax+By+Cz+D)(带入平面方程)若S全部同号,则为最外层)
该题细节非常多,需要注意
关于行列式的概念与应用:可以百度,也可以看《线性代数》。
GravatarSatoshi
2015-03-05 22:41 3楼

63. [HNOI 2004] 金属包裹

★★★★★   输入文件:enwrap.in   输出文件:enwrap.out   简单对比
时间限制:3 s   内存限制:512 MiB

【题目描述】

H公司生产了一种金属制品,是由一些笔直的金属条支撑起来的,金属条和别的金属条在交点上被焊接在了一起。现在由于美观需要,在这个产品用一层特殊的材料包裹起来。公司为了节约成本,希望消耗的材料最少(不计裁剪时的边角料的损失)。

现在给定该产品的顶点的个数,以及所有顶点的坐标,你需要根据输入的计算出包裹这个产品所需要的材料的最小面积。结果要求精确到小数点后第六位。(四舍五入)

【输入格式】

输入若干行组成:

第1行是一个整数n(4 <= n <= 100),表示顶点的个数;

第2行到第n+1行,每行是3个实数xi,yi,zi,表示第i个顶点的坐标。每个顶点的位置各不相同。

【输出格式】

输出文件只有一个实数,表示包裹一个该产品所需的材料面积的最小值。

【输入样例】

4
0 0 0
1 0 0
0 1 0
0 0 1

【输出样例】

2.366025