結果
問題 | No.132 点と平面との距離 |
ユーザー | 6soukiti29 |
提出日時 | 2017-09-07 00:50:19 |
言語 | Nim (2.0.2) |
結果 |
AC
|
実行時間 | 346 ms / 5,000 ms |
コード長 | 2,151 bytes |
コンパイル時間 | 3,571 ms |
コンパイル使用メモリ | 66,936 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-30 03:09:20 |
合計ジャッジ時間 | 4,449 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 14 ms
5,248 KB |
testcase_01 | AC | 103 ms
5,376 KB |
testcase_02 | AC | 346 ms
5,376 KB |
ソースコード
import sequtils,strutils,math type vector = tuple[x, y, z : float64] proc `+`(a, b : vector) : vector = result = (a.x + b.x, a.y + b.y, a.z + b.z) proc `-`(a, b : vector) : vector = result = (a.x - b.x, a.y - b.y, a.z - b.z) proc `*`(a : float64, b : vector) : vector = result = (a * b.x, a * b.y, a * b.z) proc `*`(a, b : vector) : float64 = result = a.x * b.x + a.y * b.y + a.z * b.z proc abs(a : vector) : float64 = if a.x > 0.0001 or a.x < -0.0001: result = abs(a.x) * sqrt(1 + pow(a.y / a.x, 2) + pow(a.z / a.x, 2)) elif a.y > 0.0001 or a.y < -0.0001: result = abs(a.y) * sqrt(1 + pow(a.z / a.y, 2)) else: result = abs(a.z) proc `=~`[T](a, b : T) : bool = if abs(a - b) < 0.00001: return true else: return false proc solve2eq(a, b : array[3, float64]) : tuple[x, y : float64] = var a = a var b = b if b[0] == 0: result.y = b[2] / b[1] result.x = (a[2] - a[1] * result.y) / a[0] return for i in countdown(2, 0): b[i] = b[i] / b[0] * a[0] for i in 0..2: b[i] -= a[i] result.y = b[2] / b[1] result.x = (a[2] - a[1] * result.y) / a[0] return proc hypotM(a, b, c : vector) : float64 = var n, k : float64 t, s, d : vector t = c - a s = b - a var A,B : array[3, float64] A = [t * t, t * s, - (a * t)] B = [t * s, s * s, - (a * s)] (n, k) = solve2eq(A, B) d = n * t + k * s + a return abs(d) var N = stdin.readline.parseInt P : seq[float64] = stdin.readline.split.map(parsefloat) T = newSeqWith(N, newSeq[float64](3)) for n in 0..<N: T[n] = stdin.readline.split.map(parsefloat) var ans : float64 var p : vector = (P[0], P[1], P[2]) for i in 0..<N: var a : vector = (T[i][0], T[i][1], T[i][2]) a = a - p for j in (i + 1)..<N: var b : vector = (T[j][0], T[j][1], T[j][2]) b = b - p for k in (j + 1)..<N: var c : vector = (T[k][0], T[k][1], T[k][2]) c = c - p ans += hypotM(a, b, c) echo formatBiggestFloat(ans, ffDecimal)