Acwing.4009 收集卡牌(期望dp)

题目

小林在玩一个抽卡游戏,其中有 n种不同的卡牌,编号为 1到 n。

每一次抽卡,她获得第 i种卡牌的概率为 pi。

如果这张卡牌之前已经获得过了,就会转化为一枚硬币。

可以用 k枚硬币交换一张没有获得过的卡。

小林会一直抽卡,直至集齐了所有种类的卡牌为止,求她的期望抽卡次数。

如果你给出的答案与标准答案的绝对误差不超过 10−4,则视为正确。

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

输入格式

输入共两行。

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

输出格式

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

数据范围

对于 20% 的数据,保证 1≤n,k≤5。 对于另外 20%的数据,保证所有 pi是相等的。 对于 100%的数据,保证
1≤n≤16,1≤k≤5,所有的 pi满足 pi≥110000,且 ∑ni=1pi=1。 注意,本题在官网必须保留
10位小数才能通过(可能是没加SPJ),在本网站无此问题,只要满足你给出的答案与标准答案的绝对误差不超过 10−4,则视为正确。

  • 输入样例1:
2 2
0.4 0.6
  • 输出样例1:
2.52

样例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
  • 输出样例2:
7.3229920752

题解

import java.text.DecimalFormat;
import java.util.*;/*** @author amuya* @create 2024-04-10-19:46*/
public class CollectCards {static int n,m;static int N=16;static int M=1<<N;//硬币不超过80,超过80直接结束static double f[][]=new double[M][N*5+1];static double p[]=new double[N+1];public static void main(String[] args) {Scanner scanner=new Scanner(System.in);n=scanner.nextInt();m=scanner.nextInt();for(int i=1;i<=n;i++){p[i]=scanner.nextDouble();}for(int i=0;i<M;i++) Arrays.fill(f[i],-1);DecimalFormat df=new DecimalFormat("#.##########");String s=df.format(dp(0,0,n));System.out.println(s);}public static double dp(int a,int b,int r){if(f[a][b]>=0) return f[a][b];if(b>=r*m) {f[a][b]=0;return 0;}f[a][b]=0;for(int i=0;i<n;i++){if((a&(1<<i))>0){f[a][b]+=p[i+1]*(dp(a,b+1,r)+1);}else{f[a][b]+=p[i+1]*(dp(a|(1<<i),b,r-1)+1);}}return f[a][b];}
}

思路

使用状态压缩DP可以存储所有情况,再通过数学推导推导出递推公式,具体推导过程如下图。
其中状态转移数组有两个参数 a(压缩状态),b(硬币数)(可有可无,仅方便计算),值为从当前状态到抽完所需要抽数的期望。
然后根据下列推导,当前期望等于接下来所有可能的概率乘以其对应的期望+1,为什么加1,因为下一种情况必然多抽了一次。再根据数学推导得到状态转移方程。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ZZULIOJ】1055: 兔子繁殖问题(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 这是一个有趣的古典数学问题&#xff0c;著名意大利数学家Fibonacci曾提出一个问题&#xff1a;有一对小兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又…

【2024】elasticsearch的安装及使用建议

为了方便本节将使用docker部署Elasticsearch&#xff0c;以下简称es。 Elasticsearch 1.基础理论部分1.1.简单介绍一下es1.2.es的基本概念和相关术语 2.elasticsearch安装部分3.elasticsearch配置及建议 1.基础理论部分 1.1.简单介绍一下es Elasticsearch是一个开源的、分布…

智能面试——录音及播放下载js-audio-recorder — post请求,formdata传参

录音插件 js-audio-recorder bug&#xff1a;本地调试调取不起来麦克风 浏览器配置安全域名 chrome://flags/Insecure origins treated as secure输入域名即可电脑需要连接上耳机 <template><div class"BaseRecorder"><div class"BaseRecorder-r…

C++递归递推混合

昆虫繁殖 题目描述&#xff1a;科学家在热带森林中发现了一种特殊的昆虫&#xff0c;这种昆虫的繁殖能力很强。每对成虫过x个月 产y对卵&#xff0c;每对卵要过两个月长成成虫。假设每个成虫不死&#xff0c;第一个月只有一对成虫&#xff0c;且卵 长成成虫后的第一个月不产卵…

【UE5 C++】各个头文件的含义

#pragma once 预处理程序指令 作用&#xff1a;保护同一个文件不会被多次包含&#xff0c;使得头文件只会被编译一次&#xff0c; #include “CoreMinimal.h” 包含了一套来自UE4的核心编程环境的普遍存在类型 #include “GameFramework/GameModeBase.h” 基于GameModeBas…

应急响应-挖矿脚本检测指南威胁情报样本定性文件清除入口修复

一、演示案例-挖矿样本-Win&Linux-危害&定性 危害&#xff1a;CPU拉满&#xff0c;网络阻塞&#xff0c;服务器卡顿等 定性&#xff1a;威胁情报平台上传解析分析&#xff0c;文件配置查看等windows样本 linux样本 二、演示案例-Linux-Web安全漏洞导致挖矿事件 某公司…

PyQt介绍——qrc资源文件使用介绍

使用介绍 在PyQt中&#xff0c;qrc文件是一种资源文件&#xff0c;用于将应用程序所需的资源&#xff08;如图像、音频文件、样式表等&#xff09;打包到一个单独的二进制文件中&#xff0c;以便在运行时轻松地加载和访问这些资源。qrc文件是用XML格式编写的&#xff0c;其中包…

Harmony鸿蒙南向驱动开发-Watchdog

看门狗&#xff08;Watchdog&#xff09;&#xff0c;又称看门狗计时器&#xff08;Watchdog timer&#xff09;&#xff0c;是一种硬件计时设备。一般有一个输入、一个输出&#xff0c;输入叫做喂狗&#xff0c;输出连接到系统的复位端。当系统主程序发生错误导致未及时清除看…

PTA 2813:画家问题 (熄灯问题)

PTA 2813&#xff1a;画家问题 &#xff08;熄灯问题&#xff09; 经典的熄灯问题&#xff0c;思路就不过多阐述&#xff0c;csdn都有 #include <bits/stdc.h> using namespace std; int num[20]; int num2[20]; int main() {int n;cin >> n;for (int i 1; i <…

RobotFramework测试框架(11)--变量文件

Variable files包含的variables可以用于test data中&#xff08;即测试用例&#xff09;中。Variables可以使用Variables section或者从命令行设置。 但是也允许动态创建。 变量文件通常使用模块实现&#xff0c;有两种实现方式。 1、直接从模块中获取变量 变量被指定为模块…

【带源码】如何开发一个视频打赏,付费观看视频的系统?

【带源码】如何开发一个视频打赏&#xff0c;付费观看视频的系统&#xff1f;开发指南来了 最近非常火爆的视频打赏系统&#xff0c;有用户端&#xff0c;管理端&#xff0c;代理端 风口来了&#xff0c;系统部署简单&#xff0c;需要详细部署教程的可以留下评论哦&#xff01…

Calico IPIP和BGP TOR的数据包走向

IPIP Mesh全网互联 文字描述 APOD eth0 10.7.75.132 -----> APOD 网关 -----> A宿主机 cali76174826315网卡 -----> Atunl0 10.7.75.128 封装 ----> Aeth0 10.120.181.20 -----> 通过网关 10.120.181.254 -----> 下一跳 BNODE eth0 10.120.179.8 解封装 --…

“FM”、“AM”信号如何解调?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

陷波器(带阻滤波器)

非广&#xff0c;为了不赘述&#xff08;器件介绍&#xff09; 陷波器是带阻滤波器的一种&#xff08;与带通滤波器正好相反&#xff0c;带通是保持指定频率的信号&#xff0c;而带阻滤波器是阻挡指定频率的信号&#xff09;&#xff0c;通过设置相应的滤波器参数&#xff0c;…

蓝桥杯 每日2题 day4

碎碎念&#xff1a;好难好难&#xff0c;&#xff0c;发呆两小时什么也写不出来&#xff0c;&#xff0c;&#xff0c;周六大寄了 10.阶乘约数 - 蓝桥云课 (lanqiao.cn) 暴力跑了两个小时没出来结果&#xff0c;&#xff0c;去看题解要用数学&#xff1a;约数定理&#xff0c…

Python中调用函数简洁方法

直接上代码 def func1():print("func1")def func2():print("func2")def func3():print("func3")def func4():print("func4")func_list [func1, func2, func3, func4]for func in func_list:func()结果如下 func1 func2 func3 func4如…

pygame发射子弹后绘制射线

import pygame import sys import mathpygame.init()screen pygame.display.set_mode((800, 600)) pygame.display.set_caption("Rotate and Shoot Bullets")# 定义子弹类 class Bullet:def __init__(self, x, y, angle):self.x xself.y yself.angle angleself.s…

经典本地影音播放器纯净无广告版

MPC-BE&#xff08;Media Player Classic Black Edition&#xff09;是来自 MPC-HC&#xff08;Media Player Classic Home Cinema&#xff09;的俄罗斯开发者重新编译优化后的一款经免费的经典全能影音播放器&#xff0c;纯净无广告&#xff0c;启动速度快&#xff0c;占用消耗…

功能测试如何到自动化测试,看这篇就够了。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 本帖不仅给大家介绍自动化测试&#xff0c;更会提供大…

MATLAB 点云体素滤波 (58)

MATLAB 体素滤波 (58) 一、基本原理二、算法实现1.代码数据的海量性始终是点云处理时需要面临的一个大问题,严重的时间消耗和内存占用影响了点云处理的发展,当然了,点云数量主要应该看项目的实际需求,若是对细节要求较高,那么点云数量不可过少,但是要求过低时,我们就可…