結果
| 問題 |
No.132 点と平面との距離
|
| コンテスト | |
| ユーザー |
__NCAstar
|
| 提出日時 | 2015-01-20 23:40:06 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 58 ms / 5,000 ms |
| コード長 | 2,745 bytes |
| コンパイル時間 | 1,298 ms |
| コンパイル使用メモリ | 161,140 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-22 23:21:01 |
| 合計ジャッジ時間 | 1,787 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 |
ソースコード
#include<bits/stdc++.h>
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define EPS (1e-10)
#define equals(a,b) (fabs((a)-(b))<EPS)
using namespace std;
//Verify AOJ 0115
class Point3d{
public:
double x,y,z;
Point3d(double x=0,double y=0,double z=0):x(x),y(y),z(z){}
Point3d operator + (const Point3d& a){
return Point3d(x+a.x,y+a.y,z+a.z);
}
Point3d operator - (const Point3d& a){
return Point3d(x-a.x,y-a.y,z-a.z);
}
Point3d operator * (const double& d){
return Point3d(x*d,y*d,z*d);
}
Point3d operator / (const double& d){
return Point3d(x/d,y/d,z/d);
}
bool operator < (const Point3d& p)const { return !equals(x,p.x)?x<p.x:((!equals(y,p.y))?y<p.y:(!equals(z,p.z)&&z<p.z)); }
bool operator == (const Point3d& p)const{
return equals(x,p.x) && equals(y,p.y) && equals(z,p.z);
}
};
//Verify AOJ 0115
struct Segment3d{
Point3d p[2];
Segment3d(Point3d p1=Point3d(),Point3d p2=Point3d()){
p[0] = p1, p[1] = p2;
}
bool operator == (const Segment3d& seg)const{
return ( p[0] == seg.p[0] && p[1] == seg.p[1] ) || ( p[0] == seg.p[1] && p[1] == seg.p[0] );
}
};
typedef Point3d Vector3d;
//Verify AOJ 0115
double dot(const Point3d& a,const Point3d& b){
return a.x*b.x + a.y*b.y + a.z*b.z;
}
//Verify AOJ 0115
Vector3d cross(const Point3d& a,const Point3d& b){
return Vector3d(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);
}
//Verify AOJ 0115
inline double norm(const Point3d &p){
return p.x*p.x + p.y*p.y + p.z*p.z;
}
//Verify AOJ 0115
inline double abs(const Point3d &p){
return sqrt(norm(p));
}
class Plane3d{
public:
Point3d normal_vector; //法線ベクトル
double d; // 平面方程式 normal_vector.x * x + normal_vector.y * y + normal_vector.z * z + d = 0
Plane3d(Point3d normal_vector=Point3d(),double d=0):normal_vector(normal_vector),d(d){}
Plane3d(Vector3d a,Vector3d b,Vector3d c){
Vector3d v1 = b - a;
Vector3d v2 = c - a;
Vector3d tmp = cross(v1,v2);
normal_vector = tmp / abs(tmp);
set_d(a);
}
//Verify AOJ 0115
//法線ベクトルnormal_vectorと平面上の1点からdを計算する
void set_d(Point3d p){
d = dot(normal_vector,p);
}
//平面と点pの距離を求める
double distanceP(Point3d p){
Point3d a = normal_vector * d;//平面上の適当な点をつくる
return abs( dot(p-a,normal_vector) );
}
};
int main(){
int N;
cin >> N;
Point3d p;
cin >> p.x >> p.y >> p.z;
vector<Point3d> arr(N);
rep(i,N) cin >> arr[i].x >> arr[i].y >> arr[i].z;
double answer = 0;
rep(i,N) REP(j,i+1,N) REP(k,j+1,N) {
Plane3d plane(arr[i],arr[j],arr[k]);
answer += plane.distanceP(p);
}
printf("%.10f\n",answer);
return 0;
}
__NCAstar