結果

問題 No.76 回数の期待値で練習
ユーザー mamekinmamekin
提出日時 2015-01-17 14:40:41
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 29 ms / 5,000 ms
コード長 1,327 bytes
コンパイル時間 850 ms
コンパイル使用メモリ 91,892 KB
実行使用メモリ 10,700 KB
最終ジャッジ日時 2023-09-04 20:11:52
合計ジャッジ時間 1,439 ms
ジャッジサーバーID
(参考情報)
judge13 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 29 ms
10,700 KB
testcase_01 AC 28 ms
10,660 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <limits>
#include <climits>
#include <cfloat>
#include <functional>
using namespace std;

int main()
{
    vector<double> tmp =
    {
        -1,
        1.0000000000000000,
        1.0833333333333333,
        1.2569444444444444,
        1.5353009259259260,
        1.6915991512345676,
        2.0513639724794235
    };
    vector<double> p(7);
    for(int i=1; i<=5; ++i){
        double x = tmp[i+1] - 1;
        for(int j=1; j<i; ++j)
            x -= tmp[i-j+1] * p[j];
        p[i] = x / tmp[1];
    }
    p[6] = 1.0 - accumulate(p.begin() + 1, p.begin() + 6, 0.0);

    vector<double> dp(1000001);
    for(int i=1; i<=1000000; ++i){
        for(int j=1; j<=6; ++j){
            if(i - j <= 0)
                dp[i] += p[j];
            else
                dp[i] += (dp[i-j] + 1.0) * p[j];
        }
    }

    int t;
    cin >> t;
    cout.setf(ios_base::fixed, ios_base::floatfield);
    cout << setprecision(10);
    while(--t >= 0){
        int n;
        cin >> n;
        printf("%.10f\n", dp[n]);
    }

    return 0;
}
0