题目描述

小林在玩一个抽卡游戏,其中有 n 种不同的卡牌,编号为 1 到 n。每一次抽卡,她获得第 i 种卡牌的概率为 pi。如果这张卡牌之前已经获得过了,就会转化为一枚硬币。可以用 k 枚硬币交换一张没有获得过的卡。

小林会一直抽卡,直至集齐了所有种类的卡牌为止,求她的期望抽卡次数。如果你给出的答案与标准答案的绝对误差不超过 10−4,则视为正确。

提示:聪明的小林会把硬币攒在手里,等到通过兑换就可以获得剩余所有卡牌时,一次性兑换并停止抽卡。

输入格式

从标准输入读入数据。

输入共两行。第一行包含两个用空格分隔的正整数 n,k,第二行给出 p1,p2,…,pn,用空格分隔。

输出格式

输出到标准输出。

输出共一行,一个实数,即期望抽卡次数。

样例1输入

2 2
0.4 0.6

Data

样例1输出

2.52

Data

样例1解释

共有 2 种卡牌,不妨记为 A 和 B,获得概率分别为 0.4 和 0.6,2 枚硬币可以换一张卡牌。下面给出各种可能出现的情况:

  • 第一次抽卡获得 A,第二次抽卡获得 B,抽卡结束,概率为 0.4×0.6=0.24,抽卡次数为 2。
  • 第一次抽卡获得 A,第二次抽卡获得 A,第三次抽卡获得 B,抽卡结束,概率为 0.4×0.4×0.6=0.096,抽卡次数为 3。
  • 第一次抽卡获得 A,第二次抽卡获得 A,第三次抽卡获得 A,用硬币兑换 B,抽卡结束,概率为 0.4×0.4×0.4=0.064,抽卡次数为 3。
  • 第一次抽卡获得 B,第二次抽卡获得 A,抽卡结束,概率为 0.6×0.4=0.24,抽卡次数为 2。
  • 第一次抽卡获得 B,第二次抽卡获得 B,第三次抽卡获得 A,抽卡结束,概率为 0.6×0.6×0.4=0.144,抽卡次数为 3。
  • 第一次抽卡获得 B,第二次抽卡获得 B,第三次抽卡获得 B,用硬币兑换 A,抽卡结束,概率为 0.6×0.6×0.6=0.216,抽卡次数为 3。

因此答案是 0.24×2+0.096×3+0.064×3+0.24×2+0.144×3+0.216×3=2.52。

样例2输入

4 3
0.006 0.1 0.2 0.694

Data

样例2输出

7.3229920752

Data

子任务

对于 20% 的数据,保证 1≤n,k≤5。

对于另外 20% 的数据,保证所有 pi 是相等的。

对于 100% 的数据,保证 1≤n≤16,1≤k≤5,所有的 pi 满足 pi≥110000,且 ∑i=1npi=1。

感觉代码没有错,数据也都能过,但是最后那个代码提交上去不对,实在不知道错在哪里了,希望各位大佬可以帮帮~~~,我在后面更新了一个记忆化搜索的答案,发现记忆化搜索真好用,可以用动态规划的好多问题都可以记忆化搜索。

代码如下:

#include <iostream>using namespace std;
const int N=17,K=5;
double dp[77][1<<N];//dp[i][j]第i次抽卡,抽到状态为j时的概率
double p[N],q[1<<N];//p[i]表示第i个卡牌的概率,q[i]表示状态为i时,i中所有抽到的卡牌的概率之和
int cnt[1<<N];
void Count1(int n)
{for(int i=0;i<1<<n;i++){int j=0,k=i;int num=0;while(k){j++;if(k&1){num++;q[i]+=p[j];}k=k>>1;}cnt[i]=num;//cout<<"cnt"<<i<<" "<<cnt[i]<<" ";//cout<<"q"<<i<<" "<<q[i]<<" ";}
}
int main()
{int n,l;cin>>n>>l;for(int i=1;i<=n;i++){cin>>p[i];}int temp=l*(n-1)+1;double sum=0;Count1(n);dp[0][0]=1;//初始化for(int i=1;i<=temp;i++)//第i次抽卡的状态{for(int j=0;j<1<<n;j++){int temp1=(n-cnt[j])*l;//if((i-cnt[j])>temp1) continue;if(cnt[j]<=i)for(int k=0;k<(1<<n)-1;k++)//第i-1次抽卡的状态{int temp2=(n-cnt[k])*l;if((cnt[k]<=i-1)&&temp2>(i-cnt[k]-1))if((cnt[k]>=cnt[j]-1)&&((j&k)==k)){if((j&k)==j){dp[i][j]+=dp[i-1][k]*q[j];}else{int x=j-k;dp[i][j]+=dp[i-1][k]*q[x];}//cout<<"("<<i<<" "<<j<<" "<<k<<") :"<<dp[i][j]<<"  ";}}if(j==(1<<n)-1){sum+=dp[i][j]*i;//cout<<i<<" "<<j<<" "<<dp[i][j]<<" "<<dp[i][j]*i<<" "<<" sum: "<<sum<<" ";continue;}if(temp1<=(i-cnt[j])){sum+=dp[i][j]*i;//cout<<i<<" "<<j<<" "<<dp[i][j]<<" "<<dp[i][j]*i<<" "<<" sum: "<<sum<<" ";}}}//cout<<endl;cout<<sum;return 0;
}

记忆化搜索:(100分)

#include<iostream>
#include<cstdio>
using namespace std;
double dp[1<<17][81],p[17];
int n,k1;
double ans=0;
double dfs(int at,int k,int cnt)
{if(dp[at][k+cnt]) return dp[at][k+cnt];if(k+cnt/k1>=n) return (double)(k+cnt);double s=0;for(int i=0;i<n;i++){if((at>>i)&1) s+=p[i]*dfs(at,k,cnt+1);else s+=p[i]*dfs(at+(1<<i),k+1,cnt);}dp[at][k+cnt]=s;return s ;}
int main()
{cin>>n>>k1;for(int i=0;i<n;i++) cin>>p[i];//dp[0][0]=1;printf("%.10lf",dfs(0,0,0));//cout<<dfs(0,0,0);return 0;
}

CSP202109-4 收集卡牌相关推荐

  1. CSP第23次 202109-4 收集卡牌 C语言答案

    CSP第23次 202109-4 收集卡牌 C语言20分答案 注意: 1.如果你是想多次*=的话,使用pow代替计算可以增加结果精确度 2.浮点数计算会有误差要注意判断条件 只拿了20分,想了两种递归 ...

  2. csp2021-09-4 收集卡牌

    题目链接:收集卡牌 因为 n ⩽ 16 n\leqslant16 n⩽16,卡牌收集情况可以用 2 16 = 65536 2^{16}=65536 216=65536个状态来表示: 又因为 k ⩽ k ...

  3. CSP 202109-4 收集卡牌

    参考题解:CSP202109-4 收集卡牌 题解 - cyx001 - 博客园 (cnblogs.com) 在上述题解的基础上进行了进一步解读和修改 本题采取算法:状态压缩dp O. 题目 题目描述 ...

  4. (CCF202109-4)收集卡牌(概率DP)

    题目链接:计算机软件能力认证考试系统 小林在玩一个抽卡游戏,其中有 n 种不同的卡牌,编号为 1 到 n.每一次抽卡,她获得第 i 种卡牌的概率为 pi.如果这张卡牌之前已经获得过了,就会转化为一枚硬 ...

  5. 202109-4 收集卡牌

    思路借鉴:收集卡牌 看到只有16张牌,想到状压dp f[i][j]表示抽到卡牌状态为i,已经抽了j次,此时的概率 注意:最后输出的时候要输出10位小数,否则会0分. #include <bits ...

  6. 4501. 收集卡牌

    输入样例1: 3 11 2 3 1 2 2 2 3 2 2 3 1 输出样例1: 00100000001 输入样例2: 4 8 4 1 3 3 2 3 3 3 输出样例2: 00001000 第一反应 ...

  7. 第23次CSP认证 第4题 收集卡牌(记忆化搜索,状压)

    链接:http://118.190.20.162/view.page?gpid=T132 思路:先写一个暴力搜索,然后把中间结点的状态存起来,就是记忆化搜索,状态要存搜索到的层数和选择的卡牌数,0代表 ...

  8. 哈利波特魔法觉醒Mac端(卡牌角色扮演游戏)

    每个人都有一个魔法梦,近日沉寂多年的霍格沃茨魔法学院,已经恢复招生了!哈利波特:魔法觉醒 for Mac是由<哈利·波特>官方授权的一款卡牌类角色扮演演戏!哈利波特魔法觉醒mac游戏共分为 ...

  9. 【玩法设计】炉石传说吃鸡竞技场构思

    前言 2021炉石传说迎来了7周年生日,公布的"贫瘠之地的锤炼"标志着<炉石传说>新一年第一阶段的开始--狮鹫年! 增加了全新游戏模式--<炉石传说>佣兵模 ...

最新文章

  1. Matlab频域高/低通滤波
  2. 一分钟了解阿里云产品:高性能计算HPC
  3. OPTEETrusted Application结构分析
  4. 知识图谱基础知识之一——人人都能理解的知识图谱
  5. 使用EF.Core将同一模型映射到多个表
  6. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
  7. centos下编译安装curl拓展
  8. java io编程_Java_IO编程
  9. python cnn 时间序列_有什么好的模型可以做高精度的时间序列预测呢?
  10. 【开发工具之eclipse】7、eclipse代码自动提示,eclipse设置代码自动提示
  11. python中实参必须是常量吗_7 python函数参数(必须参数、可变参数、关键字参数)...
  12. 安装net framework3.5提示需要.net framework3.5,错误代码0x800f081f
  13. java的log计算_Java普通对数(log)计算方法
  14. window10 Embedded 各分支
  15. 禅道的测试模块(编写用例)
  16. Linux TCP/IP大合集
  17. Bentley 软件公司 Acceleration Fund 宣布成立 Bentley 下属公司 Virtuosity
  18. spark常见面试题
  19. 四川大学计算机科学保研夏令营面试面经
  20. RTOS内功修炼记(七)—— 内存管理

热门文章

  1. 怎样在视频画面指定位置编辑马赛克
  2. 《搜索》— NYOJ 42—一笔画问题
  3. ios(苹果)设备直播流媒体 服务搭建
  4. excel 画散点图 怎么设置图片的分辨率_Slynyrd像素画教程:像素画基础教程
  5. 抢红包小程序(Java、头歌实验)
  6. Java-IO-字符流
  7. NodeJS与模块系统
  8. python函数可以分为哪几类_python函数有哪几种
  9. html中切角文本框,css实现切角效果
  10. 第三节-戴师兄数据分析学习笔记-excel最全函数