CSP202109-4 收集卡牌
题目描述
小林在玩一个抽卡游戏,其中有 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 收集卡牌相关推荐
- CSP第23次 202109-4 收集卡牌 C语言答案
CSP第23次 202109-4 收集卡牌 C语言20分答案 注意: 1.如果你是想多次*=的话,使用pow代替计算可以增加结果精确度 2.浮点数计算会有误差要注意判断条件 只拿了20分,想了两种递归 ...
- csp2021-09-4 收集卡牌
题目链接:收集卡牌 因为 n ⩽ 16 n\leqslant16 n⩽16,卡牌收集情况可以用 2 16 = 65536 2^{16}=65536 216=65536个状态来表示: 又因为 k ⩽ k ...
- CSP 202109-4 收集卡牌
参考题解:CSP202109-4 收集卡牌 题解 - cyx001 - 博客园 (cnblogs.com) 在上述题解的基础上进行了进一步解读和修改 本题采取算法:状态压缩dp O. 题目 题目描述 ...
- (CCF202109-4)收集卡牌(概率DP)
题目链接:计算机软件能力认证考试系统 小林在玩一个抽卡游戏,其中有 n 种不同的卡牌,编号为 1 到 n.每一次抽卡,她获得第 i 种卡牌的概率为 pi.如果这张卡牌之前已经获得过了,就会转化为一枚硬 ...
- 202109-4 收集卡牌
思路借鉴:收集卡牌 看到只有16张牌,想到状压dp f[i][j]表示抽到卡牌状态为i,已经抽了j次,此时的概率 注意:最后输出的时候要输出10位小数,否则会0分. #include <bits ...
- 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 第一反应 ...
- 第23次CSP认证 第4题 收集卡牌(记忆化搜索,状压)
链接:http://118.190.20.162/view.page?gpid=T132 思路:先写一个暴力搜索,然后把中间结点的状态存起来,就是记忆化搜索,状态要存搜索到的层数和选择的卡牌数,0代表 ...
- 哈利波特魔法觉醒Mac端(卡牌角色扮演游戏)
每个人都有一个魔法梦,近日沉寂多年的霍格沃茨魔法学院,已经恢复招生了!哈利波特:魔法觉醒 for Mac是由<哈利·波特>官方授权的一款卡牌类角色扮演演戏!哈利波特魔法觉醒mac游戏共分为 ...
- 【玩法设计】炉石传说吃鸡竞技场构思
前言 2021炉石传说迎来了7周年生日,公布的"贫瘠之地的锤炼"标志着<炉石传说>新一年第一阶段的开始--狮鹫年! 增加了全新游戏模式--<炉石传说>佣兵模 ...
最新文章
- Matlab频域高/低通滤波
- 一分钟了解阿里云产品:高性能计算HPC
- OPTEETrusted Application结构分析
- 知识图谱基础知识之一——人人都能理解的知识图谱
- 使用EF.Core将同一模型映射到多个表
- 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
- centos下编译安装curl拓展
- java io编程_Java_IO编程
- python cnn 时间序列_有什么好的模型可以做高精度的时间序列预测呢?
- 【开发工具之eclipse】7、eclipse代码自动提示,eclipse设置代码自动提示
- python中实参必须是常量吗_7 python函数参数(必须参数、可变参数、关键字参数)...
- 安装net framework3.5提示需要.net framework3.5,错误代码0x800f081f
- java的log计算_Java普通对数(log)计算方法
- window10 Embedded 各分支
- 禅道的测试模块(编写用例)
- Linux TCP/IP大合集
- Bentley 软件公司 Acceleration Fund 宣布成立 Bentley 下属公司 Virtuosity
- spark常见面试题
- 四川大学计算机科学保研夏令营面试面经
- RTOS内功修炼记(七)—— 内存管理