結果
問題 | No.132 点と平面との距離 |
ユーザー | imulan |
提出日時 | 2016-07-31 03:09:17 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 42 ms / 5,000 ms |
コード長 | 1,262 bytes |
コンパイル時間 | 1,765 ms |
コンパイル使用メモリ | 169,564 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-11-06 21:26:30 |
合計ジャッジ時間 | 2,239 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
6,816 KB |
testcase_01 | AC | 15 ms
6,824 KB |
testcase_02 | AC | 42 ms
6,816 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define each(itr,c) for(__typeof(c.begin()) itr=c.begin(); itr!=c.end(); ++itr) #define all(x) (x).begin(),(x).end() #define mp make_pair #define pb push_back #define fi first #define se second struct pt{double x,y,z;}; typedef pt vec; vec make_vec(pt a, pt b) { vec ret; ret.x = b.x-a.x; ret.y = b.y-a.y; ret.z = b.z-a.z; return ret; } vec cross(vec a, vec b) { vec ret; ret.x = a.y*b.z - a.z*b.y; ret.y = a.z*b.x - a.x*b.z; ret.z = a.x*b.y - a.y*b.x; return ret; } double dist(double a, double b, double c, double d, pt p) { double nu = abs(a*p.x + b*p.y + c*p.z + d); double de = sqrt(a*a + b*b + c*c); return nu/de; } int main() { int n; cin >>n; pt p; cin >>p.x >>p.y >>p.z; vector<pt> q(n); rep(i,n) cin >>q[i].x >>q[i].y >>q[i].z; double ans=0; rep(k,n)rep(j,k)rep(i,j) { vec h = cross(make_vec(q[j],q[i]), make_vec(q[k],q[i])); //平面の式 double A=h.x, B=h.y, C=h.z; double D = -(h.x*q[i].x + h.y*q[i].y + h.z*q[i].z); ans += dist(A,B,C,D,p); } printf("%.10lf\n", ans); return 0; }