import mathn = int(input())points = [tuple(map(int, input().split())) for _ in range(n)]points.append((0, 0, 0)) # 마지막 구간은 기지로 돌아오는 길cur = (0, 0, 0)total = 0.0best, best_sq = 1, -1for i, p in enumerate(points, start=1): dx, dy, dz = p[0] - cur[0], p[1] - cur[1], p[2] - cur[2] sq = dx * dx + dy * dy + dz * dz # 정수 그대로 비교한다 total += math.sqrt(sq) print(f"{total:.2f}") if sq > best_sq: best, best_sq = i, sq cur = pprint(best)
JavaScriptmain.js · 26 行
const nums = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const n = nums[0];const points = [];for (let i = 0; i < n; i++) points.push(nums.slice(1 + 3 * i, 4 + 3 * i));points.push([0, 0, 0]); // 마지막 구간은 기지로 돌아오는 길let cur = [0, 0, 0];let total = 0;let best = 1;let bestSq = -1;const out = [];points.forEach((p, i) => { const dx = p[0] - cur[0]; const dy = p[1] - cur[1]; const dz = p[2] - cur[2]; const sq = dx * dx + dy * dy + dz * dz; // 최대 약 8×10^12: 2^53 안이라 정확하다 total += Math.sqrt(sq); out.push(total.toFixed(2)); if (sq > bestSq) { best = i + 1; bestSq = sq; } cur = p;});out.push(best);console.log(out.join("\n"));
TypeScriptmain.ts · 28 行
import { readFileSync } from "node:fs";const nums: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const n = nums[0];type Point = [number, number, number];const points: Point[] = [];for (let i = 0; i < n; i++) points.push([nums[1 + 3 * i], nums[2 + 3 * i], nums[3 + 3 * i]]);points.push([0, 0, 0]); // 마지막 구간은 기지로 돌아오는 길let cur: Point = [0, 0, 0];let total = 0;let best = 1;let bestSq = -1;const out: string[] = [];points.forEach((p, i) => { const dx = p[0] - cur[0]; const dy = p[1] - cur[1]; const dz = p[2] - cur[2]; const sq = dx * dx + dy * dy + dz * dz; // 최대 약 8×10^12: 2^53 안이라 정확하다 total += Math.sqrt(sq); out.push(total.toFixed(2)); if (sq > bestSq) { best = i + 1; bestSq = sq; } cur = p;});out.push(String(best));console.log(out.join("\n"));
JavaMain.java · 36 行
import java.util.Locale;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long cx = 0, cy = 0, cz = 0; double total = 0; int best = 1; long bestSq = -1; StringBuilder out = new StringBuilder(); for (int i = 1; i <= n + 1; i++) { // 마지막(n + 1번째) 구간은 기지 (0, 0, 0)으로 돌아오는 길 long x = 0, y = 0, z = 0; if (i <= n) { x = sc.nextLong(); y = sc.nextLong(); z = sc.nextLong(); } long dx = x - cx, dy = y - cy, dz = z - cz; long sq = dx * dx + dy * dy + dz * dz; // 차이가 2×10^6이면 제곱은 4×10^12: long이 필요하다 total += Math.sqrt(sq); out.append(String.format(Locale.ROOT, "%.2f", total)).append('\n'); if (sq > bestSq) { best = i; bestSq = sq; } cx = x; cy = y; cz = z; } out.append(best).append('\n'); System.out.print(out); }}
C#Main.cs · 42 行
using System;using System.Globalization;using System.Text;class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); long cx = 0, cy = 0, cz = 0; double total = 0; int best = 1; long bestSq = -1; var out_ = new StringBuilder(); for (int i = 1; i <= n + 1; i++) { // 마지막(n + 1번째) 구간은 기지 (0, 0, 0)으로 돌아오는 길 long x = 0, y = 0, z = 0; if (i <= n) { string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); x = long.Parse(p[0]); y = long.Parse(p[1]); z = long.Parse(p[2]); } long dx = x - cx, dy = y - cy, dz = z - cz; long sq = dx * dx + dy * dy + dz * dz; // 차이가 2×10^6이면 제곱은 4×10^12: long이 필요하다 total += Math.Sqrt(sq); out_.Append(total.ToString("F2", CultureInfo.InvariantCulture)).Append('\n'); if (sq > bestSq) { best = i; bestSq = sq; } cx = x; cy = y; cz = z; } out_.Append(best).Append('\n'); Console.Write(out_); }}
C++main.cpp · 29 行
#include <cmath>#include <cstdio>#include <iostream>int main() { int n; std::cin >> n; long long cx = 0, cy = 0, cz = 0; double total = 0; int best = 1; long long bestSq = -1; for (int i = 1; i <= n + 1; i++) { // 마지막(n + 1번째) 구간은 기지 (0, 0, 0)으로 돌아오는 길 long long x = 0, y = 0, z = 0; if (i <= n) std::cin >> x >> y >> z; long long dx = x - cx, dy = y - cy, dz = z - cz; long long sq = dx * dx + dy * dy + dz * dz; // 제곱은 4×10^12까지: long long total += std::sqrt(static_cast<double>(sq)); std::printf("%.2f\n", total); if (sq > bestSq) { best = i; bestSq = sq; } cx = x; cy = y; cz = z; } std::printf("%d\n", best);}
Cmain.c · 29 行
#include <math.h>#include <stdio.h>int main(void) { int n; scanf("%d", &n); long long cx = 0, cy = 0, cz = 0; double total = 0; /* float는 일곱 자리쯤에서 끝나 소수 둘째 자리를 지킬 수 없다 */ int best = 1; long long best_sq = -1; for (int i = 1; i <= n + 1; i++) { /* 마지막(n + 1번째) 구간은 기지 (0, 0, 0)으로 돌아오는 길 */ long long x = 0, y = 0, z = 0; if (i <= n) scanf("%lld %lld %lld", &x, &y, &z); long long dx = x - cx, dy = y - cy, dz = z - cz; long long sq = dx * dx + dy * dy + dz * dz; /* 제곱은 4×10^12까지: long long */ total += sqrt((double)sq); printf("%.2f\n", total); if (sq > best_sq) { best = i; best_sq = sq; } cx = x; cy = y; cz = z; } printf("%d\n", best); return 0;}
Craykonmain.cray · 31 行
n = コンソール.行読み().数に();cx = 0;cy = 0;cz = 0;total = 0;best = 1;bestSq = -1;繰り返す (i = 1; i <= n + 1; i++){ // 마지막(n + 1번째) 구간은 기지 (0, 0, 0)으로 돌아오는 길 p = [0, 0, 0]; もし (i <= n) { p = コンソール.数読み(); } dx = p[0] - cx; dy = p[1] - cy; dz = p[2] - cz; sq = dx * dx + dy * dy + dz * dz; // 최대 약 8×10^12: 2^53 안이라 정확하다 total += 数学.平方根(sq); コンソール.書く(文字.桁そろえ(total, 2)); もし (sq > bestSq) { best = i; bestSq = sq; } cx = p[0]; cy = p[1]; cz = p[2];}コンソール.書く(best);