SRM488 Div1 Easy(250) TheBoredomDivOne

TheBoredomDivOne

動的計画法。退屈ではない人がi人の場合に全員を退屈にする時間の期待値をbi、その時に退屈ではない人をj人選ぶ確率をpjとすると、

bi = p0 bi + p1 bi-1 + p2 bi-2 + 1。

変形して、

bi = ( p1 bi-1 + p2 bi-2 + 1 ) / (1-p0)。

#include <vector>

using namespace std;

class TheBoredomDivOne{public:
double find( int n, int m )
{
    vector<double> b(m+2);

    b[0] = b[1] = 0;
    for ( int i=1; i<=m; i++ )
    {
        int total = (n+m)*(n+m-1)/2;
        double p0 = (double)(n+m-i)*(n+m-i-1)/2 / total;
        double p1 = (double)i*(n+m-i) / total;
        double p2 = (double)i*(i-1)/2 / total;

        b[i+1] = ( p1*b[i] + p2*b[i-1] + 1 ) / (1-p0);
    }

    return b[m+1];
}};