记录编号 151429 评测结果 AAAAAAAAAAA
题目名称 [HNOI 2004] 金属包裹 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.289 s
提交时间 2015-03-06 08:18:13 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int SIZEN=110;
const double eps=1e-10;
class Point{
public:
	double x,y,z;
	Point(double x_=0,double y_=0,double z_=0){
		x=x_,y=y_,z=z_;
	}
};
Point operator - (const Point &a,const Point &b){
	return Point(a.x-b.x,a.y-b.y,a.z-b.z);
}
double Dot(const Point &a,const Point &b){
	return a.x*b.x+a.y*b.y+a.z*b.z;
}
Point Cross(const Point &a,const Point &b){
	return Point(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);
}
double length(const Point &p){
	return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
}
int N;
Point P[SIZEN];
const int BASE=10000;
double contribute(int a,int b,int c){
	Point normal=Cross(P[b]-P[a],P[c]-P[a]);
	int cntp=0,cntn=0;//正负两面的个数
	for(int i=1;i<=N;i++){
		if(i==a||i==b||i==c) continue;
		if(Dot(P[i]-P[a],normal)<0) cntn++;
		else cntp++;
	}
	if(cntn==0||cntp==0){
		return length(normal)/2.0;
	}
	else return 0;
}
void work(void){
	double ans=0;
	for(int i=1;i<=N;i++){
		for(int j=1;j<i;j++){
			for(int k=1;k<j;k++){
				ans+=contribute(i,j,k);
			}
		}
	}
	printf("%.6lf\n",ans);
}
double random_eps(void){
	return (rand()%BASE)*eps/BASE;
}
void jitter(void){
	for(int i=1;i<=N;i++){
		P[i].x+=random_eps();
		P[i].y+=random_eps();
		P[i].z+=random_eps();
	}
}
void read(void){
	scanf("%d",&N);
	for(int i=1;i<=N;i++){
		scanf("%lf%lf%lf",&P[i].x,&P[i].y,&P[i].z);
	}
}
int main(){
	freopen("enwrap.in","r",stdin);
	freopen("enwrap.out","w",stdout);
	read();
	jitter();
	work();
	return 0;
}