CF768D Jon and Orbs

题目链接:https://codeforces.ml/problemset/problem/768/D

思路:dp[i][j] 代表 前i天取到了j张卡的概率 那么每天可以由上一天加上今天有没有

抽到新卡来转移 枚举到10000是为了确保能找到大于p/2000的值  当然也可以只用一维的数组存 

第二层循环倒序即可  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int mod=1e4;
 6 const int maxn=1e4+10;
 7 double dp[maxn][2222];
 8 
 9 
10 int main()
11 {
12     ios::sync_with_stdio(0);
13     cin.tie(0);
14     int k,q;
15     cin>>k>>q;
16     dp[1][1]=1;
17     for(int i=2;i<=10000;i++)
18     {
19         for(int j=1;j<=min(i,k);j++)
20         {
21             dp[i][j]=1.0*j/k*dp[i-1][j]+1.0*(k-j+1)/k*dp[i-1][j-1];
22         }
23     }
24     //cout<<dp[3][3]<<" debug"<<'\n';
25     while(q--)
26     {
27         double p;
28         cin>>p;
29         p/=2000.0;
30         int num=0;
31         for(int i=1;i<=10000;i++)
32         {
33             if(dp[i][k]>=p)
34             {
35                 num=i;
36                 break;
37             }
38         }
39         cout<<num<<'\n';
40     }
41 
42 
43 }
View Code

 

posted @ 2020-11-27 19:03  canwinfor  阅读(131)  评论(0)    收藏  举报