1. 程式人生 > >2018 ccpc吉林站 D題題解 The Moon

2018 ccpc吉林站 D題題解 The Moon

比賽時沒寫出來導致沒拿到銀,自閉。

一開始想到概率dp,但是沒想到初始狀態,就去推公式了,(思維僵化)。

以 q 為 dp 陣列下標,當 q 為100%時,期望步數為 1/p。把這個期望作為初始狀態往下逆推。(這裡要是想出來應該就好寫了)

因為還沒有交題平臺,所以也不能說自己寫的是對的。。。 大體思路應該是對的吧,畢竟樣例過了就是過了(滑稽臉)

據說還有隨機100w次過的(發抖)   我用偽隨機演算法試了下,精度只有小數點後三位(寫醜了?還是太菜。。。。)

#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
double dp[1001];              //下標為q*1000
double eps=1e-8;
int main()
{
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while(T--)
    {
        double p;
        cin>>p;
        p=p/100;
        mem(dp,0);
        dp[1000]=1/p;
        for(int i=1000;i>=20;i--)
        {
            if(i+20<=1000&&dp[i+20]>0)
            {
                dp[i]=i/1000.0*p*1.0+p*(1-i/1000.0)*(dp[i+20]+1);
            }
            if(i+15<=1000&&dp[i+15]>0)
            {
                if(dp[i]>eps)
                    dp[i]+=(1-p)*(dp[i+15]+1);
                else if(p<1.0-eps)
                    dp[i]=i/1000.0*p*1.0+(1-p)*(dp[i+15]+1);
            }
        }
        cout<<fixed<<setprecision(10)<<dp[20]<<endl;
    }
    return 0;
}