记录编号 |
151429 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
[HNOI 2004] 金属包裹 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}