Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】ABC 375 B - Traveling Takahashi Problem | 茶コーダーが解くAtCoder

atcoder.jp

実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 65

問題概要

座標平面上の点  (a, b) から点  (c, d) に移動するには  \sqrt{(a-c)^2+(b-d)^2} のコストがかかる。このとき、原点からスタートし  N 個の点   (X_1,Y_1),\cdots,(X_N,Y_N) へこの順に移動したのち原点に戻る場合の、コストの総和を求めよ。

制約

  • 入力は全て整数。
  •  1 \leq N \leq 2\times 10^5
  •  -10^9 \leq X_i,Y_i \leq 10^9

考察

訪れるべき  N 個の点を配列に読み込み、その先頭と末尾に  (0, 0) を追加する。その後、指示通りにシミュレーションしていけばよい。

なお、小数の答えを出力するときは、fixed << setprecision(x)coutに続けて記述することで、小数点以下  x 桁までを出力することができる。私はこれを

#define fix(x) fixed << setprecision(x)

のようにマクロ化している。

コード

#include <bits/stdc++.h>
using namespace std;

using lld = long double;

#define fix(x) fixed << setprecision(x)
#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)

// ======================================== //

lld dist(lld x1, lld y1, lld x2, lld y2) {
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main()
{
    int N;
    cin >> N;
    vector<lld> X(N + 2), Y(N + 2);
    X.push_back(0);
    Y.push_back(0);
    rep(i, 1, N + 1) cin >> X[i] >> Y[i];
    X.push_back(0);
    Y.push_back(0);

    lld ans = 0;
    rep(i, 0, N + 1) {
        ans += dist(X[i], Y[i], X[i + 1], Y[i + 1]);
    }

    cout << fix(10) << ans << endl;
}

atcoder.jp

実装時間: 5分