[题解]the moon

Topic

The Moon

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1120 Accepted Submission(s): 497
Special Judge

Problem Description

The Moon card shows a large, full moon in the night’s sky, positioned between two large towers. The Moon is a symbol of intuition, dreams, and the unconscious. The light of the moon is dim, compared to the sun, and only vaguely illuminates the path to higher consciousness which winds between the two towers.

Random Six is a FPS game made by VBI(Various Bug Institution). There is a gift named “Beta Pack”. Mr. K wants to get a beta pack. Here is the rule.
Step 0. Let initial chance rate q = 2%.
Step 1. Player plays a round of the game with winning rate p.
Step 2. If the player wins, then will go to Step 3 else go to Step 4.
Step 3. Player gets a beta pack with probability q. If he doesn’t get it, let q = min(100%, q + 2%) and he will go to Step 1.
Step 4. Let q = min(100%, q + 1.5%) and goto Step 1.
Mr. K has winning rate p% , he wants to know what’s the expected number of rounds before he needs to play.

Input

The first line contains testcase number T (T ≤ 100). For each testcase the first line contains an integer p (1 ≤ p ≤ 100).

Output

For each testcase print Case i : and then print the answer in one line, with absolute or relative error not exceeding 106.

Sample Input

2
50
100

Sample Output

Case 1: 12.9933758002
Case 2: 8.5431270393

Source

2018CCPC Jilin Division (Replay)


answer

Main idea:

  • Give you a winning rate p, and an initial winning rate q=2%, each time you play a game.

  • If the game is won, the lottery will be drawn:
    -q+2% if the game is not drawn, and then continue to play the game.
    -If you get a draw, the game ends directly.

  • If the game loses, q+1.5%, and then continue to play the game.

    Ask the expected number of games played, and the highest winning rate is 100%

Ideas:

  1. First of all, the subject seeks expectations, and the guess is that the probability dp is reversed.

  2. Determine the definition of dp, use whatever you want, and define dp[i] as the expected number of games when the probability q is i. Because the range of i is [0, 1], for the convenience of dp, let i = q ∗ 1000 i=q*1000i=q1000

  3. So we should reverse from dp[1000] to dp[20], dp[20] is the answer

  4. dp[1000] is equivalent to finding the expected number of wins for a game with a winning rate of Q.
    E x = Q + (1 − Q) Q + (1 − Q) 2 Q +.. Ex=Q+(1−Q) Q+(1−Q)^2Q+..Ex=Q+(1Q)Q+(1Q)2Q+. .
    It can be seen that the above formula is the arithmetic series, summing to obtain 1 / Q. So dp[1000]=1/q;

  5. Consider the recurrence:

    • d p [ i ] + = p ∗ ( 1 − q ) ∗ ( 1 + d p [ m i n ( i + 20 , 1000 ) ] ; dp[i]+=p*(1-q)*(1+dp[min(i+20, 1000)]; dp[i]+=p(1q)(1+dp[min(i+20,1 0 0 0 ) ] ; Won but did not get

    • d p [ i ] + = ( 1 − p ) ∗ ( 1 + d p [ m i n ( i + 15 , 1000 ) ] ; dp[i]+=(1-p)*(1+dp[min(i+15, 1000)]; dp[i]+=(1p)(1+dp[min(i+15,1 0 0 0 ) ] ; lost

    • d p [ i ] + = p ∗ q dp[i]+=p*q dp[i]+=pq ; won and got

    • 所以 d p [ i ] = p ∗ ( 1 − q ) ∗ ( 1 + d p [ m i n ( i + 20 , 1000 ) ] + ( 1 − p ) ∗ ( 1 + d p [ m i n ( i + 15 , 1000 ) ] + p ∗ q dp[i]=p*(1-q)*(1+dp[min(i+20, 1000)]+(1-p)*(1+dp[min(i+15, 1000)]+p*q dp[i]=p(1q)(1+dp[min(i+20,1000)]+(1p)(1+dp[min(i+15,1000)]+pq

    Note: The reason why the dp above needs to be +1 is because this bureau also needs to add it.

  6. Use a for to recursively dp, directly coding.

Code:

#define Oo ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#include <bits/stdc++.h>
using namespace std;
#define PI acos(-1.0)
typedef long long ll;
double dp[1005];
int main()
{
      Oo
      int t;
      cin>>t;
      for(int flag=1; flag<=t; flag++)
      {
            double p;cin>>p;
            p=p/100.0;
            dp[1000]=1.0/p;
            for (int i=999; i>=20; i--)
            {
                  double q=i/1000.0;
                  dp[i]=p*(1-q)*(1+dp[min(1000,i+20)])+(1-p)*(1+dp[min(i+15,1000)])+p*q;
            }
            cout << "Case "<<flag<<": " ;
            cout <<fixed<< setprecision(10) << dp[20] << endl;
      }
	return 0;
}

Personal hexo blog .

Guess you like

Origin blog.csdn.net/osusoer/article/details/108622259