• 【期望初步、例题】单选错位+小魔女帕琪+收集邮票


    【例题1】单选错位

    1.每道题的正确率是\frac{1}{max(a[i],a[i-1])}

    2.所有题目等价

    1. #include
    2. using namespace std;
    3. int n,A,B,C,a[10000005];
    4. double ans=0;
    5. int main()
    6. {
    7. scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1);
    8. for(int i=2;i<=n;i++)
    9. {
    10. a[i]=(long long) ((long long)a[i-1]*A+B) %100000001;
    11. }
    12. for(int i=1;i<=n;i++) a[i]=(long long)a[i]%C+1;
    13. if(n==1)
    14. {
    15. printf("1.000");
    16. return 0;
    17. }
    18. a[n+1]=a[1];
    19. for(int i=2; i<=n+1; i++)
    20. {
    21. ans+=(double)1/max(a[i],a[i-1]);
    22. }
    23. printf("%.3lf",ans);
    24. return 0;
    25. }

    小魔女帕琪 

    设N=所有晶石数目

    1.这里每一种情况的概率对答案贡献就是1         E=\sum p[i]

    2.对于所有七元组(1~7、2~8等)来说,只要有一个成立,对期望贡献就是1【答案乘(N-6)】

    3.所有七元组顺序随意,【答案乘7!】

    4.对于每个七元组,有7个位,每个位放不同的数的概率               \frac{a[i]}{n-i+1}

    1. #include
    2. using namespace std;
    3. double n,ans=1,a[10];
    4. int main()
    5. {
    6. for(int i=1;i<=7;i++)
    7. {
    8. scanf("%lf",&a[i]);
    9. n+=a[i];
    10. }
    11. if(n<7)
    12. {
    13. printf("0.000");
    14. return 0;
    15. }
    16. for(int i=1;i<=7;i++) ans=ans*a[i]/(n-i+1);
    17. printf("%.3lf",ans*1*2*3*4*5*6*7*(n-6));
    18. return 0;
    19. }

    收集邮票 

    这里f[i],g[i]  代表:

    1.在已经收集到 i 张邮票后还要收集多少次的期望

    2.在已经收集到 i 张邮票之后所花费用的期望

    这两个状态都应该分情况讨论:

    1.下一次买的是已经有的,p[i]=i/n

    2.下一次买到了新邮票,p[i]=(n-i)/n

    并且次数都需要加一,那么对于数组 g 来说,除了同上的分情况之外,加上的应该是

    g[i]=\frac{i}{n}[g[i]+(f[i]+1)]+\frac{n-i}{n}[g[i+1]+(f[i+1]+1)]

    1. #include
    2. using namespace std;
    3. int n;
    4. double f[100010],g[100010];
    5. int main()
    6. {
    7. scanf("%d",&n);
    8. for(int i=1;i<=n;i++)
    9. {
    10. f[i]=f[i-1]+1.0*n/(n-i+1);
    11. g[i]=g[i-1]+f[i]*1.0*n/(n-i+1);
    12. }
    13. printf("%.2lf",g[n]);
    14. return 0;
    15. }

    Game on Treehttps://www.luogu.com.cn/problem/CF280C

    这个题告诉我们:

    每一个节点需要被删掉的一定是他以上的任何一个祖先节点都没有被删,这样在他的祖先链上,我们在本次选中这个节点的概率是1/(dep),由于选个点对步数的贡献是一,所以求和

    1. #include
    2. using namespace std;
    3. int n,head[100010],tot;
    4. double ans;
    5. struct edge{int to,next;}e[200010];
    6. void add_edge(int u,int v)
    7. {
    8. e[++tot].to=v;
    9. e[tot].next=head[u];
    10. head[u]=tot;
    11. }
    12. void dfs(int u,int fa,int dep)
    13. {
    14. ans+=1.0/dep;
    15. for(int i=head[u];i;i=e[i].next)
    16. {
    17. int v=e[i].to;
    18. if(v==fa) continue;
    19. dfs(v,u,dep+1);
    20. }
    21. }
    22. int main()
    23. {
    24. scanf("%d",&n);
    25. for(int i=1;i
    26. {
    27. int u,v;
    28. scanf("%d%d",&u,&v);
    29. add_edge(u,v);
    30. add_edge(v,u);
    31. }
    32. dfs(1,0,1);
    33. printf("%.8lf",ans);
    34. return 0;
    35. }

    期望的计算:如果概率为k的代价为w1,概率为(1-k)的代价为w2,那么期望就是概率乘代价,即

    k*w1+(1-k)*w2

    经典期望DP:[NOIP2016 提高组] 换教室 

    1. #include
    2. using namespace std;
    3. int read() {
    4. int x=0,f=1;
    5. char c=getchar();
    6. while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    7. while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    8. return x*f;
    9. }
    10. double min(double aa,double bb)
    11. {
    12. if(aareturn aa;
    13. else return bb;
    14. }
    15. int n,m,v,e,a[3010],b[3010];
    16. double dis[310][310],k[3010];
    17. double f[3010][3010][2],ans=1e9;
    18. int main()
    19. {
    20. n=read(),m=read(),v=read(),e=read();
    21. for(int i=1;i<=n;i++) a[i]=read();
    22. for(int i=1;i<=n;i++) b[i]=read();
    23. for(int i=1;i<=n;i++) scanf("%lf",&k[i]);
    24. for(int i=1;i<=v;i++)
    25. for(int j=1;j< i;j++) dis[i][j]=dis[j][i]=0x3f3f3f;
    26. for(int i=1;i<=e;i++)
    27. {
    28. int u=read(),v=read();
    29. double w;
    30. scanf("%lf",&w);
    31. dis[u][v]=dis[v][u]=min((double)dis[u][v],w);
    32. }
    33. //floyd
    34. for(int k=1;k<=v;k++)
    35. for(int i=1;i<=v;i++)
    36. for(int j=1;j
    37. {
    38. if(dis[i][j]>dis[i][k]+dis[k][j])
    39. {
    40. dis[i][j]=dis[i][k]+dis[k][j];
    41. dis[j][i]=dis[i][j];
    42. }
    43. }
    44. for(int i=1;i<=n;i++)
    45. for(int j=0;j<=m;j++)
    46. for(int k=0;k<=1;k++) f[i][j][k]=0x3f3f3f;
    47. f[1][0][0]=0,f[1][1][1]=0;
    48. for(int i=1;i<=n;i++)
    49. for(int j=0;j<=i&&j<=m;j++)
    50. {
    51. f[i][j][0]=min(f[i-1][j][0]+dis[a[i-1]][a[i]],f[i-1][j][1]+dis[a[i-1]][a[i]]*(1.0-k[i-1])+dis[b[i-1]][a[i]]*k[i-1]);
    52. if(j>=1)
    53. {
    54. f[i][j][1]=min(f[i-1][j-1][0]+dis[a[i-1]][b[i]]*k[i]+dis[a[i-1]][a[i]]*(1.0-k[i]),
    55. f[i-1][j-1][1]+dis[b[i-1]][b[i]]*k[i-1]*k[i]
    56. +dis[b[i-1]][a[i]]*k[i-1]*(1.0-k[i])
    57. +dis[a[i-1]][b[i]]*(1.0-k[i-1])*k[i]
    58. +dis[a[i-1]][a[i]]*(1.0-k[i-1])*(1.0-k[i]));
    59. }
    60. }
    61. for(int i=0;i<=m;i++)
    62. {
    63. ans=min(ans,f[n][i][0]);
    64. ans=min(ans,f[n][i][1]);
    65. }
    66. printf("%.2lf",ans);
    67. return 0;
    68. }

  • 相关阅读:
    java编程培训学习的就业前景好不好
    Xcode如何利用预览(Preview)让SwiftUI视图快速适配不同尺寸的设备
    戴尔大步进军经典量子计算混合模型
    LeetCode 每日一题 2022/10/17-2022/10/23
    从键盘上输入数字并查找某数
    【游戏技术】L4D 求生之路自主开发模式汇总
    React Context源码是怎么实现的呢
    使用centos搭建内网的yum源
    facechain人物写真生成工业级开源
    Linux安装Jenkins
  • 原文地址:https://blog.csdn.net/m0_60137414/article/details/126007981