ABC145 C - Average Length
目次
# 問題
https://atcoder.jp/contests/abc145/tasks/abc145_c
個の町の座標が与えれるので、町を訪問するすべての道順について距離の平均値を求める問題です.
# 解説
ある順番での町の訪問においてその総距離は各町間の距離の合計です.
これはすべての町間について計算すれば良いので単純にとなります.
すべての町の並べ方は順列なので.
C++では配列の順列はalgorithm
ライブラリに入っているnext_permutation
という関数で簡単に生成出来ます.
これはソート済みの配列を与えると破壊的に並べ替えていく関数です.
使い方は解答のソースコードを見てください.
# 計算量
$O(N \cdot N!)$.
# 解答
#define MAX_N 8
Int N;
vector<Vector2> C(MAX_N);
void input() {
cin >> N;
loop(n,0,N) cin >> C[n];
C.resize(N);
}
double distance() {
double d = 0;
loop(n,0,N-1) {
d += (C[n+1] - C[n]).length();
}
return d;
}
void solve() {
sort(span_all(C));
double d = 0;
Int p = 0;
do {
p++;
d += distance();
} while (next_permutation(span_all(C)));
cout << d / p << endl;
}
int main(void) {
cout.precision(15);
input();
solve();
return 0;
}