結果

問題 No.463 魔法使いのすごろく🎲
ユーザー te-shte-sh
提出日時 2017-12-12 11:57:43
言語 D
(dmd 2.106.1)
結果
AC  
実行時間 4 ms / 2,000 ms
コード長 1,551 bytes
コンパイル時間 2,634 ms
コンパイル使用メモリ 157,592 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-06-12 23:00:55
合計ジャッジ時間 3,806 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 1 ms
6,940 KB
testcase_02 AC 1 ms
6,940 KB
testcase_03 AC 1 ms
6,940 KB
testcase_04 AC 1 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 1 ms
6,940 KB
testcase_07 AC 1 ms
6,940 KB
testcase_08 AC 1 ms
6,940 KB
testcase_09 AC 4 ms
6,940 KB
testcase_10 AC 1 ms
6,940 KB
testcase_11 AC 1 ms
6,944 KB
testcase_12 AC 1 ms
6,944 KB
testcase_13 AC 1 ms
6,940 KB
testcase_14 AC 3 ms
6,944 KB
testcase_15 AC 3 ms
6,944 KB
testcase_16 AC 1 ms
6,940 KB
testcase_17 AC 3 ms
6,940 KB
testcase_18 AC 1 ms
6,940 KB
testcase_19 AC 1 ms
6,944 KB
testcase_20 AC 1 ms
6,944 KB
testcase_21 AC 4 ms
6,940 KB
testcase_22 AC 4 ms
6,944 KB
testcase_23 AC 4 ms
6,940 KB
testcase_24 AC 4 ms
6,940 KB
testcase_25 AC 3 ms
6,940 KB
testcase_26 AC 3 ms
6,940 KB
testcase_27 AC 4 ms
6,940 KB
testcase_28 AC 3 ms
6,944 KB
testcase_29 AC 3 ms
6,944 KB
testcase_30 AC 4 ms
6,944 KB
testcase_31 AC 4 ms
6,940 KB
testcase_32 AC 3 ms
6,940 KB
testcase_33 AC 4 ms
6,944 KB
testcase_34 AC 4 ms
6,944 KB
testcase_35 AC 1 ms
6,944 KB
testcase_36 AC 1 ms
6,940 KB
testcase_37 AC 1 ms
6,940 KB
testcase_38 AC 1 ms
6,944 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import std.algorithm, std.conv, std.range, std.stdio, std.string;

void main()
{
  auto rd = readln.split.to!(int[]), n = rd[0], m = rd[1];
  auto c = readln.split.to!(real[]);

  auto a = new real[][](n-1, n);

  foreach (i; 0..n-1) {
    foreach (j; 0..n)
      a[i][j] = 0;
  }

  foreach (i; 0..n-1) {
    a[i][i] = -1;
    foreach (j; 1..m+1) {
      auto k = i+j;
      if (k == n-1) continue;
      if (k > n-1) k = n-1-(k-(n-1));
      a[i][k] += 1.0L/m;
      a[i][n-1] -= c[k-1]/m;
    }
  }

  gaussElimination(a, n-1);

  auto e = new real[](n-1);
  foreach (i; 0..n-1) e[i] = a[i][n-1];

  auto f = new real[](n-1);
  foreach_reverse (i; 0..n-1) {
    if (i+m >= n-1) {
      f[i] = 0;
    } else {
      auto r = 0.0L;
      foreach (j; 1..m+1)
        r += (f[i+j] + c[i+j-1]) / m;
      foreach (j; 1..m+1)
        r = min(r, e[i+j] + c[i+j-1]);
      f[i] = r;
    }
  }

  writefln("%.10f", f[0]);
}

auto gaussElimination(T)(ref T[][] a, size_t n)
{
  import std.math;

  size_t p;
  T pmax;

  foreach (k; 0..n-1) {
    p = k;
    pmax = a[k][k].abs;

    foreach (i; k+1..n)
      if (a[i][k].abs > pmax) {
        p = i;
        pmax = a[i][k].abs;
      }

    if (p != k) swap(a[k], a[p]);

    auto akk = a[k][k];
    foreach (i; k+1..n) {
      auto aik = a[i][k];
      foreach (j; k..n+1)
        a[i][j] -= aik * (a[k][j] / akk);
    }
  }

  a[n-1][n] /= a[n-1][n-1];
  foreach_reverse (i; 0..n-1) {
    auto ax = T(0);
    foreach (j; i+1..n)
      ax += a[i][j] * a[j][n];
    a[i][n] = (a[i][n] - ax) / a[i][i];
  }
}
0