首页 > ACM题库 > HDU-杭电 > HDU 1411 校庆神秘建筑[解题报告] C++
2013
12-09

HDU 1411 校庆神秘建筑[解题报告] C++

校庆神秘建筑

问题描述 :

杭州电子科技大学即将迎来50周年的校庆,作为校庆委员会成员的我被上级要求设计一座神秘的建筑物来迎合校庆,因此我苦思冥想了一个月,终于设计出了一套方案,这座建筑物有点象古老埃及的金字塔,不过这个神秘建筑的根基是三角形的而不是矩形的,从数学的专业角度来讲,它是四面体。当我打算上交我的设计图纸的时候发现,我不知道怎么计算这个神秘建筑的体积(我知道这座建筑的各边的尺寸),于是我找来了聪明的你来帮助我解决这个难题。

输入:

输入文件包含6个不超过1000的实数,每个数之间用空格隔开。每个数代表金字塔ABCD的一条棱边长度,棱边排序如下:AB,AC,AD,BC,BD,CD。

输出:

输出数据应是一个实数,表示金字塔的体积,精确到4位小数。

样例输入:

2 2 2 2 2 2 

样例输出:

0.9428

题意解法很明确,给你四面体的6条边,求体积

用公式

//code

/*
cosA=(b²+c²-a²)/(2bc)
cosB=(a²+c²-b²)/(2ac)
cosC=(a²+b²-c²)/(2ab)

V=1/6*abc(sin^2α+sin^2β+sin^2γ+2cosαcosβcosγ-2)^(1/2);
*/
#include<iostream>
#include<cmath>
using namespace std;
double S(double a, double  b, double c)
{
	double P=(a+b+c)*1.0/2.0;
	return sqrt(P*(P-a)*(P-b)*(P-c));
}
int main()
{
	double a,b,c,_a,_b,_c;
	while(cin>>a>>b>>c>>_c>>_b>>_a)
	{
		double sina = _a/(2.0*_a*b*c/(4.0*S(_a,b,c)));
		double sinb = _b/(2.0*a*_b*c/(4.0*S(a,_b,c)));
		double sinc = _c/(2.0*a*b*_c/(4.0*S(a,b,_c)));
		double cosa = (b*b+c*c-_a*_a)*1.0/(2*b*c);
		double cosb = (a*a+c*c-_b*_b)*1.0/(2*a*c);
		double cosc = (a*a+b*b-_c*_c)*1.0/(2*a*b);
		double V = 1.0/6.0*a*b*c*sqrt(pow(sina,2)+pow(sinb,2)+pow(sinc,2)+2.0*cosa*cosb*cosc-2.0);
		printf("%.4lf\n",V);
	}
	return 0;
}

解题报告转自:http://blog.csdn.net/u010724594/article/details/8977288


  1. 可以根据二叉排序树的定义进行严格的排序树创建和后序遍历操作。如果形成的排序树相同,其树的前、中、后序遍历是相同的,但在此处不能使用中序遍历,因为,中序遍历的结果就是排序的结果。经在九度测试,运行时间90ms,比楼主的要快。

  2. 其实国内大部分公司对算法都不够重视。特别是中小型公司老板根本都不懂技术,也不懂什么是算法,从而也不要求程序员懂什么算法,做程序从来不考虑性能问题,只要页面能显示出来就是好程序,这是国内的现状,很无奈。

  3. 第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。

  4. 约瑟夫也用说这么长……很成熟的一个问题了,分治的方法解起来o(n)就可以了,有兴趣可以看看具体数学的第一章,关于约瑟夫问题推导出了一系列的结论,很漂亮