新・Bランクレベルアップ【シミュレーション 4】位置情報システム
【位置情報システム】 コード 1 (95点)
reader.on('close', () => {
const n = Number(lines[0]);
const L = new Array(101); // 0 ~ 100 の位置情報
const T = []; // 位置情報を取得した時間
for (let i = 1; i <= n; i++) {
const [t, y, x] = lines[i].split(' ').map(Number);
L[t] = [y, x]; // L の t番目は[y, x]
T.push(t);
}
for (let i = 0; i < n - 1; i++) {
const [t1, y1, x1] = [T[i], L[T[i]][0], L[T[i]][1]]; // 移動前の情報
const [t2, y2, x2] = [T[i + 1], L[T[i + 1]][0], L[T[i + 1]][1]]; // 移動後の情報
const [t3, y3, x3] = [t2 - t1, y2 - y1, x2 - x1]; // 移動後の情報 - 移動前の情報 = 移動時間と移動量
const [yy, xx] = [y3 / t3, x3 / t3]; // 移動量÷移動時間= 1あたりの移動量
for (let j = 1; j < t2 - t1; j++) {
const [Y, X] = [L[t1][0] + Math.trunc(yy * j), L[t1][1] + Math.trunc(xx * j)];
L[t1 + j] = [Y, X]; // Lのj番目に[Y, X]を保存
}
}
L.forEach(a => {
console.log(...a);
});
});
いろいろ試したけど 結局 100点にはならなかった。誤差が出るみたいね。
採点の仕方にちょっと不満があるかも…( ´~`).。
【位置情報システム】 コード 2 (C++実装例参照)
reader.on('close', () => {
const n = Number(lines[0]);
const T = []; // 時刻
const Y = []; // Y座標
const X = []; // X座標
for (let i = 1; i <= n; i++) {
const [t, y, x] = lines[i].split(' ').map(Number);
T.push(t);
Y.push(y);
X.push(x);
}
let now = 0; // 現在時刻
for (let i = 0; i <= 100; i++) { // 現在時刻 0 〜 100まで
if (i === T[now]) {
console.log(Y[now], X[now]);
now++; 次の座標へ
} else {
const [N, P] = [now, now - 1];
const Y_now = Y[P] + Math.trunc((i - T[P]) * (Y[N] - Y[P]) / (T[N] - T[P]));
const X_now = X[P] + Math.trunc((i - T[P]) * (X[N] - X[P]) / (T[N] - T[P]));
console.log(Y_now, X_now);
}
}
});
C++の実装例に沿って書き換えたら 100点でした。
コメント