結果

問題 No.132 点と平面との距離
ユーザー imulanimulan
提出日時 2016-07-31 03:08:23
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 43 ms / 5,000 ms
コード長 1,441 bytes
コンパイル時間 1,594 ms
コンパイル使用メモリ 169,224 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-06 21:26:28
合計ジャッジ時間 2,083 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
5,248 KB
testcase_01 AC 15 ms
5,248 KB
testcase_02 AC 43 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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);

        // double S = min({abs(A), abs(B), abs(C), abs(D)});
        // A/=S;
        // B/=S;
        // C/=S;
        // D/=S;
        // printf("%lf %lf %lf %lf\n",A,B,C,D );
        ans += dist(A,B,C,D,p);
    }

    printf("%.10lf\n", ans);
    return 0;
}
0