2018 ccpc吉林站 D題題解 The Moon
阿新 • • 發佈:2018-12-11
比賽時沒寫出來導致沒拿到銀,自閉。
一開始想到概率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; }