当前位置: 首页 > news >正文

大厂真题:【DP】米哈游2023秋招-米小游与魔法少女-奇运

题目描述与示例

题目描述

米小游都快保底了还没抽到希儿,好生气哦!只能打会活动再拿点水晶。

米小游和世界第一可爱的魔法少女 TeRiRi 正在打 BOSS,BOSS 的血量为h,当 BOSS 血量小于等于0时,BOSS 死亡。TeRiRi 有一套牌,在一轮中,她会按顺序一张一张的将卡牌打出,套牌中有两种卡牌:

  1. 时来运转:获得x幸运币
  2. 幸运一掷:造成x点伤害,并投掷所有幸运币,造成等于所有幸运币掷出的点数之和的伤害。

幸运币可以等概率的投掷出1∼6之间的点数。 (所以为什么不叫骰子呢?)

米小游想知道,TeRiRi 的套牌在一轮内击杀 BOSS 的概率。

输入描述

第一行输入两个整数n (1≤n≤100)h (1≤h≤10^9),分别表示卡牌张数和 BOSS 血量。

接下来n行,每行首先输入两个整数t (1≤t≤2)x (1≤x≤10)t1表示卡牌为时来运转,t2表示卡牌为幸运一掷。

输出描述

输出一个实数表示答案,你的答案与标准答案的误差不超过10^−4都被认为是正确答案。

示例一

输入

2 5
1 1
2 1

输出

0.5

说明

幸运币掷出4及以上的概率为0.5,再加上1点固定伤害,即可击杀BOSS。

示例二

输入

3 1145
1 4
1 9
1 9

输出

0

说明

无论如何都无法击杀BOSS。

解题思路

对于固定顺序的套牌,投掷幸运币的数量是固定的。这里要注意的是,由于时来运转之后必须接上幸运一掷才能将幸运币打出造成伤害,所以如果最后的若干张连续的卡牌是时来运转,这些最后获得的幸运币也是无法造成伤害的。

我们将造成的伤害分为两部分,固定伤害和随机伤害,前者为打出y个幸运币必定造成的z点伤害,后者为y个幸运币掷出点数和的伤害。

假设整套卡牌一共投掷了y个幸运币,造成的固定伤害z点,如果想要击杀BOSS,随机伤害必须至少达到h-z点才可以。当然,如果h-z≤0,则必定可以击杀BOSS。

问题就转换为,投掷出y个幸运币,点数总和超过h-z的概率是多少?

由于每一个幸运币都是独立的,在掷出第i个幸运币时,其结果是从掷出第i-1个幸运币时得到的各种结果转移得到的,因此我们可以使用动态规划来解决该问题。我们考虑动态规划三部曲:

  1. dp数组的含义是什么?
  • dp数组是一个长度为(y+1)×(h-z+1)的二维矩阵,dp[i][j]表示掷出第i个幸运币时,有多大的概率可以取得和为j的结果,即造成和为j的伤害。
  • 特别地,由于只需要判断伤害之和大于等于h-z的概率,而不用关心具体的分布,dp数组内层的第h-z个元素,即dp[i][h-z],表示求和大于等于h-z的概率。
  1. 动态转移方程是什么?
  • 由于幸运币掷出点数1-6是等概率的,故对于某一个特定的dp[i-1][j],在掷出第i个幸运币时,dp[i-1][j]的结果将等概率地转换到dp[i][j+1]dp[i][j+2]dp[i][j+3]dp[i][j+4]dp[i][j+5]dp[i][j+6],即每一个状态都可以取得1/6的转移。
  • 另外,如果j+k之后超过了h-z,则将直接获得(7-k)/6 * dp[i-1][j]的概率。
for i in range(1, y+1):for j in range(i-1, h-z+1):for k in range(1, 7):if j + k >= h - z:dp[i][h-z] += (7-k)/6 * dp[i-1][j]breakelse:dp[i][j+k] += 1/6 * dp[i-1][j]
  1. dp数组如何初始化?
  • 考虑不投掷任何幸运币的情况,那么只有一种情况,也就是在投掷0个幸运币的时候获得求和为0的概率为恒定1。故初始化dp[0][0] = 1
dp = [[0] * (h-z+1) for _ in range(y+1)]
dp[0][0] = 1

考虑完上述问题后,代码其实呼之欲出了。

代码

Python

# 题目:【DP】米哈游2023秋招-米小游与魔法少女-奇运
# 作者:闭着眼睛学数理化
# 算法:DP
# 代码有看不懂的地方请直接在群上提问y = 0       # 掷出幸运币的总个数
z = 0       # 全部造成的固定伤害
x_temp = 0  # 时来运转获得的幸运币n, h = map(int, input().split())
for _ in range(n):t, x = map(int, input().split())# 时来运转if t == 1:x_temp += x# 幸运一掷else:y += x_tempx_temp = 0z += x# 如果固定伤害已经大于h,直接输出1
if h - z <= 0:print(1)
# 否则才需要进行dp过程
else:# 初始化dp数组# dp[i][j]表示掷出了i个幸运币时,# 有多大的概率可以取得和为j的结果,即造成和为j的伤害。dp = [[0] * (h-z+1) for _ in range(y+1)]dp[0][0] = 1# 考虑每一个幸运币for i in range(1, y+1):# 对于每一个幸运币考虑打出i-1个硬币后的# 每一种求和结果的概率# 注意,由于已经掷出了i-1个幸运币# 那么求和结果至少为i-1,因为每个幸运币点数至少为1点# 因此j遍历时起点可以从i-1开始for j in range(i-1, h-z+1):# 如果求和j尚未在上一次投掷中取得,# 则可以直接考虑下一个幸运币if dp[i-1][j] == 0:break# 遍历掷出六种不同点数k的情况,# 当前点数则可以取得j+kfor k in range(1, 7):# 如果当前点数j+k超过了击杀所需点数# 则更新dp[i][h-z]# 为dp[i-1][j]对应的概率乘以(7-k)/6if j + k >= h - z:dp[i][h-z] += (7-k)/6 * dp[i-1][j]break# 如果当前点数j+k尚未超过击杀所需点数# 则其概率由dp[i-1][j]六等分后转移得到else:dp[i][j+k] += 1/6 * dp[i-1][j]# 输出最后一行的最后一个元素# 表示打出第y个幸运币后,造成伤害大于等于h-z点的概率print(dp[y][h-z])

Java

import java.util.Scanner;public class Main {public static void main(String[] args) {int y = 0;            // 掷出幸运币的总个数int z = 0;            // 全部造成的固定伤害int x_temp = 0;       // 时来运转获得的幸运币Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int h = scanner.nextInt();for (int i = 0; i < n; i++) {int t = scanner.nextInt();int x = scanner.nextInt();// 时来运转if (t == 1) {x_temp += x;}// 幸运一掷else {y += x_temp;x_temp = 0;z += x;}}// 如果固定伤害已经大于h,直接输出1if (h - z < 0) {System.out.println("1");}// 否则才需要进行dp过程else {// 初始化dp数组// dp[i][j]表示掷出了i个幸运币时,// 有多大的概率可以取得和为j的结果,即造成和为j的伤害。double[][] dp = new double[y + 1][h - z + 1];dp[0][0] = 1.0;// 考虑每一个幸运币for (int i = 1; i <= y; i++) {// 对于每一个幸运币考虑打出i-1个硬币后的// 每一种求和结果的概率// 注意,由于已经掷出了i-1个幸运币// 那么求和结果至少为i-1,因为每个幸运币点数至少为1点// 因此j遍历时起点可以从i-1开始for (int j = i - 1; j <= h - z; j++) {// 如果求和j尚未在上一次投掷中取得,// 则可以直接考虑下一个幸运币if (dp[i - 1][j] == 0) {break;}// 遍历掷出六种不同点数k的情况,// 当前点数则可以取得j+kfor (int k = 1; k <= 6; k++) {// 如果当前点数j+k超过了击杀所需点数// 则更新dp[i][h-z]// 为dp[i-1][j]对应的概率乘以(7-k)/6if (j + k >= h - z) {dp[i][h - z] += (7 - k) / 6.0 * dp[i - 1][j];break;}// 如果当前点数j+k尚未超过击杀所需点数// 则其概率由dp[i-1][j]六等分后转移得到else {dp[i][j + k] += 1.0 / 6.0 * dp[i - 1][j];}}}}// 输出最后一行的最后一个元素// 表示打出第n个幸运币后,造成伤害大于等于h-z点的概率System.out.println(String.format("%.5f", dp[y][h - z]));}}
}

C++

#include <iostream>
#include <vector>
#include <iomanip>using namespace std;int main() {int y = 0;            // 掷出幸运币的总个数int z = 0;            // 全部造成的固定伤害int x_temp = 0;       // 时来运转获得的幸运币int n, h;cin >> n >> h;for (int i = 0; i < n; i++) {int t, x;cin >> t >> x;// 时来运转if (t == 1) {x_temp += x;}// 幸运一掷else {y += x_temp;x_temp = 0;z += x;}}// 如果固定伤害已经大于h,直接输出1if (h - z < 0) {cout << fixed << setprecision(10) << 1 << endl;}// 否则才需要进行dp过程else {// 初始化dp数组// dp[i][j]表示掷出了i个幸运币时,// 有多大的概率可以取得和为j的结果,即造成和为j的伤害。vector<vector<double>> dp(y + 1, vector<double>(h - z + 1, 0));dp[0][0] = 1.0;// 考虑每一个幸运币for (int i = 1; i <= y; i++) {// 对于每一个幸运币考虑打出i-1个硬币后的// 每一种求和结果的概率// 注意,由于已经掷出了i-1个幸运币// 那么求和结果至少为i-1,因为每个幸运币点数至少为1点// 因此j遍历时起点可以从i-1开始for (int j = i - 1; j <= h - z; j++) {// 如果求和j尚未在上一次投掷中取得,// 则可以直接考虑下一个幸运币if (dp[i - 1][j] == 0) {break;}// 遍历掷出六种不同点数k的情况,// 当前点数则可以取得j+kfor (int k = 1; k <= 6; k++) {// 如果当前点数j+k超过了击杀所需点数// 则更新dp[i][h-z]// 为dp[i-1][j]对应的概率乘以(7-k)/6if (j + k >= h - z) {dp[i][h - z] += (7 - k) / 6.0 * dp[i - 1][j];break;}// 如果当前点数j+k尚未超过击杀所需点数// 则其概率由dp[i-1][j]六等分后转移得到else {dp[i][j + k] += 1.0 / 6.0 * dp[i - 1][j];}}}}// 输出最后一行的最后一个元素// 表示打出第n个幸运币后,造成伤害大于等于h-z点的概率cout << fixed << setprecision(5) << dp[y][h - z] << endl;}return 0;
}

时空复杂度

时间复杂度:O(yh)。其中y为投掷出的幸运币的总数,h为BOSS总血量,dp过程需要进行双重循环。

空间复杂度:O(yh)dp数组所占空间。如果使用滚动dp,空间复杂度可以降低到O(h)
华为OD算法冲刺训练
华为OD算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

30+天陪伴式学习,20+直播课时,300+动画图解视频,200+LeetCode经典题,100+华为OD真题,还有简历修改与模拟面试将为你解锁

可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)

绿色聊天软件戳 od1336了解更多

相关文章:

大厂真题:【DP】米哈游2023秋招-米小游与魔法少女-奇运

题目描述与示例 题目描述 米小游都快保底了还没抽到希儿&#xff0c;好生气哦&#xff01;只能打会活动再拿点水晶。 米小游和世界第一可爱的魔法少女 TeRiRi 正在打 BOSS&#xff0c;BOSS 的血量为h&#xff0c;当 BOSS 血量小于等于0时&#xff0c;BOSS 死亡。TeRiRi 有一…...

后端面经学习自测(一)

文章目录 1、MySQL-MVCC2、MySQL-原子性怎么实现3、MySQL-持久性怎么实现隔离性怎么实现 4、操作系统-死锁产生手写死锁死锁排查 5、操作系统-避免死锁死锁的四个必要条件预防死锁 6、操作系统-pageCache是什么零拷贝 7、计算机网络-TCP的可靠性和顺序性怎么实现8、计算机网络-…...

win10、win11安装Ubuntu 22.04

目前为止&#xff08;2023年10月6日&#xff09;&#xff0c;最新的 Ubuntu 版本是 Ubuntu 22.04。你可以按照以下步骤在 Windows 上使用 WSL 安装 Ubuntu 22.04&#xff1a; 检查系统要求&#xff1a; 确保你的操作系统是 Windows 10 或更高版本&#xff0c;并已安装 Windows …...

golang gin框架1——简单案例以及api版本控制

gin框架 gin是golang的一个后台WEB框架 简单案例 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {//以json形式输出&#xff0c;还可以xml protobufc.JSON…...

Redisson—分布式对象

每个Redisson对象实例都会有一个与之对应的Redis数据实例&#xff0c;可以通过调用getName方法来取得Redis数据实例的名称&#xff08;key&#xff09;。 RMap map redisson.getMap("mymap"); map.getName(); // mymap 所有与Redis key相关的操作都归纳在RKeys这…...

alsa pcm接口之在unix环境的传输方法

在unix环境,数据片段响应被接受通过standard I/O call或事件等待路径(poll或select功能),为完成列表,异步通知响应该被列举出来.ALSA实现那些方法被描述在ALSA transfers部分. 标准I/O传输(Standadrd I/O transfers) 这个标准I/O传输常常使用read和write C语言函数集,对于那些函…...

小谈设计模式(20)—组合模式

小谈设计模式&#xff08;20&#xff09;—组合模式 专栏介绍专栏地址专栏介绍 组合模式对象类型叶节点组合节点 核心思想应用场景123 结构图结构图分析 Java语言实现首先&#xff0c;我们需要定义一个抽象的组件类 Component&#xff0c;它包含了组合节点和叶节点的公共操作&a…...

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […...

一文详解动态链表和静态链表的区别

1、引言 本文主要是对动态链表和静态链表的区别进行原理上的讲解分析&#xff0c;先通过对顺序表和动态链表概念和特点的原理性介绍&#xff0c;进而引申出静态链表的作用&#xff0c;以及其概念。通过这些原理性的概述&#xff0c;最后总结归纳出动态链表和静态链表的区别。本…...

[C国演义] 第十三章

第十三章 三数之和四数之和 三数之和 力扣链接 根据题目要求: 返回的数对应的下标各不相同三个数之和等于0不可包含重复的三元组 – – 即顺序是不做要求的 如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组输出答案顺序不做要求 暴力解法: 排序 3个for循环 去重 — — N^3, …...

<二>Qt斗地主游戏开发:过场动画的实现

1. 过场动画效果 2. 思路分析 过场动画较为简单&#xff0c;只有一个进度条在进行滚动&#xff0c;因此实现起来不需要动画相关处理&#xff0c;仅需要图片和定时器设定&#xff0c;让进度条动起来即可。我们可以创建一个对话框&#xff0c;设定背景图片以及对话框透明无边框&a…...

链式法则(Chain Rule)

定义 链式法则&#xff08;Chain Rule&#xff09;是概率论和统计学中的一个基本原理&#xff0c;用于计算联合概率分布或条件概率分布的乘积。它可以用于分解一个复杂的概率分布为多个较简单的条件概率分布的乘积&#xff0c;从而简化概率分析问题。 链式法则有两种常见的形…...

AUTOSAR COM模块框架梳理

框架&#xff1a; COM的功能主要就是两个&#xff1a; 把IPDU内的signal提取出来提供给SWC使用&#xff0c;把SWC发送的signal拷贝到IPDU buffer内 所以&#xff0c;COM的关键字是 signal, signal group, IPDU, IPDU group Signal group 是为了保证 Complex Data Types 的数…...

详细介绍区块链之挖矿

对不起&#xff0c;大家&#xff0c;这篇文章对作者来说实在是太有意义和含金量了&#xff0c;作者想把它设置为关注博主才能见全文&#xff0c;请大家理解&#xff01;如果觉得还是看不懂&#xff0c;抱歉耽误大家的时间&#xff0c;就请取消关注&#xff01;&#xff01;&…...

华为OD机试真题-路灯照明问题(Java/C++/Go/Python)

【华为OD机试真题】路灯照明问题(Java/C++/Go/Python) 题目描述 在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。 每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 输入描述 第一行为一个数N…...

嵌入式技术面试基本规则

潜规则1&#xff1a;面试的本质不是考试&#xff0c;而是告诉面试官你会做什么 经验不够的小伙伴特别容易犯的一个错误&#xff0c;不清楚面试官到底想问什么&#xff0c;其实整个面试中面试官并没有想难倒你的意思&#xff0c;只是想通过提问的方式来知道你会什么。 比如stm…...

osg实现自定义插件读取自定义格式的模型文件到场景

目录 1. 前言 2. 预备知识 3. 工具、原料 4. 代码实现 1. 前言 osg提供了很多插件来读取模型文件到场景中&#xff0c;这些插件支持大约70种格式类型的文件&#xff0c;但现实中的文件是各式各样&#xff0c;osg不可能囊括所有类型文件&#xff0c;当osg不支持某种类型格式…...

redis进阶

redis.conf 启动的时候就通过配置文件来启动的&#xff01; # 这个不是配置的&#xff0c;就是在这儿说明一下 # 当配置中需要配置内存大小时&#xff0c;可以使用 1k, 5GB, 4M 等类似的格式&#xff0c;其转换方式如下(不区分大小写) # # 1k > 1000 bytes # 1kb > 102…...

(一)正点原子STM32MP135移植——准备

一、简述 使用板卡&#xff1a;正点原子的ATK-DLMP135 V1.2 从i.mx6ull学习完过来&#xff0c;想继续学习一下移植uboot和内核的&#xff0c;但是原子官方没有MP135的移植教程&#xff0c;STM32MP157的移植教程用的又是老版本的代码&#xff0c;ST官方更新后的代码不兼容老版本…...

Kotlin的关键字 lateinit 和 lazy

序、完善一下曾经的草稿。 Kotlin通常要求我们在定义属性后立即对起进行初始化&#xff0c;当我们不知道理想的初始值时&#xff0c;这样做似乎很奇怪&#xff0c;尤其是在生命周期驱动android属性的情况下。 lateinit 简介 lateinit&#xff0c;Kotlin提供的一个可以延迟初…...

Vue项目里用Video.js播m3u8直播流,我踩过的那些坑(videojs-contrib-hls版)

Vue项目中Video.js集成m3u8直播流的深度排坑指南 1. 引言&#xff1a;当流媒体遇上Vue生态 在Vue项目中实现m3u8直播流播放&#xff0c;看似只是简单的播放器集成&#xff0c;实则暗藏玄机。作为经历过多个企业级视频平台开发的老手&#xff0c;我必须坦言&#xff1a;官方文档…...

对比直接使用厂商API体验Taotoken聚合接入的价值

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商API体验Taotoken聚合接入的价值 在开发基于大模型的应用时&#xff0c;许多团队和个人开发者都曾面临一个选择&am…...

3分钟解锁八大网盘直链:无需客户端的极速下载秘籍

3分钟解锁八大网盘直链&#xff1a;无需客户端的极速下载秘籍 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

MultiBreak:大模型多轮越狱成功率飙升54%,我们正在失去对话安全的最后防线

2026年5月3日&#xff0c;来自全球顶尖AI安全实验室的联合研究团队发布了MultiBreak——迄今为止规模最大、多样性最高的大模型多轮越狱攻击基准。实验结果令人震惊&#xff1a;在DeepSeek-R1-7B上&#xff0c;MultiBreak的攻击成功率&#xff08;ASR&#xff09;比此前最优数据…...

SuperDuper框架:AI模型与数据库的无缝集成与向量搜索实践

1. 项目概述&#xff1a;当AI应用开发遇上“超级复制”如果你正在构建一个AI驱动的应用&#xff0c;无论是智能客服、内容生成还是数据分析&#xff0c;你大概率会面临一个经典困境&#xff1a;模型训练好了&#xff0c;但怎么把它变成一个稳定、可扩展、能处理真实世界复杂数据…...

基于ASR与LLM的视频字幕翻译:ChatGPT-Subtitle-Translator实战指南

1. 项目概述&#xff1a;一个能“听懂”视频的翻译官如果你经常需要观看外语视频&#xff0c;无论是技术教程、学术讲座还是娱乐内容&#xff0c;肯定遇到过字幕翻译的难题。机器翻译生硬、专业术语错漏百出&#xff0c;手动翻译又耗时耗力。今天要聊的这个项目&#xff0c;就是…...

个人开发者选择Taotoken Token Plan套餐的成本控制心得

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 个人开发者选择Taotoken Token Plan套餐的成本控制心得 1. 背景与需求&#xff1a;从按需计费到寻求稳定预算 作为一名独立开发者…...

ABAQUS多孔介质渗流分析保姆级教程:从渗透系数设置到Soil分析步详解

ABAQUS多孔介质渗流分析实战指南&#xff1a;从零搭建渗流模型 第一次打开ABAQUS进行多孔介质分析时&#xff0c;面对密密麻麻的参数选项&#xff0c;大多数工程师都会感到无从下手。渗流分析作为岩土工程、生物力学等领域的基础仿真需求&#xff0c;其核心难点不在于理论复杂度…...

ClawPanel:AI Agent统一管理面板,内置智能助手实现自动化运维

1. 项目概述与核心价值 如果你正在寻找一个能帮你统一管理 OpenClaw 和 Hermes Agent 这两个热门 AI Agent 框架的工具&#xff0c;并且希望这个工具本身也足够智能&#xff0c;能帮你解决安装、配置、排障等一系列繁琐问题&#xff0c;那么 ClawPanel 就是你一直在等的那个“…...

从Python列表到Numpy数组:手把手教你数据科学入门必备的ndarray操作避坑指南

从Python列表到Numpy数组&#xff1a;数据科学必备的ndarray操作避坑指南 当你第一次尝试用Python处理数值计算时&#xff0c;可能会惊讶地发现&#xff1a;用纯Python列表做矩阵乘法比Excel还慢。这不是你的代码有问题&#xff0c;而是你还没遇到Numpy的ndarray——这个数据科…...