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

腾讯2025年校招笔试真题手撕(二)

一、题目

最近以比特币为代表的数字货币市场非常动荡,聪明的小明打算用马尔科夫链来建模股市。如图所示,该模型有三种状态:“行情稳定”,“行情大跌”以及“行情大涨”。每一个状态都以一定的概率转化到下一个状态。比如,“行情稳定”以0.4的概率转化到“行情大跌”的状态。

有了概率转移矩阵P,我们只要知道一个初始状态 ,我们就容易可以知道第 t 步三种状态的概率了。由此可以知道行情什么时候大涨大跌,从而发家致富,赢取白富美,走向人生巅峰。比如我们想知道第1步之后“行情大跌”的概率,那么由全概率公式和马尔科夫链的性质(第t步的概率只和第t-1步有关):

可以通过该模型,计算出第t步的“行情大涨”的概率吗?如果这个概率大于0.5那么输出1,否则输出0。

输入描述 第1行输入为测试数据组数T(1<=T<1000),接下来T组每5行的数据格式为 T组第1行是步长1<=t<=10。 T组第2行是一个3维的初始状态 T组第3行到第5行是3*3的概率转移矩阵P,每行有三个浮点数

输出描述 如果第t步的“行情大涨”概率大于0.5那么输出1,否则输出0

二、分析

该问题着重于预测数字货币市场行情在未来特定时间步处于“行情大涨”状态的可能性,以此辅助决策。题目要求利用马尔科夫链这一数学工具,基于给定的初始状态和转移概率矩阵,计算第 t 步时“行情大涨”状态发生的概率是否超过 0.5。马尔科夫链的核心特性在于无记忆性,即第 t 步的状态仅依赖于第 t-1 步的状态,这使得我们能够通过逐步迭代的方式,依据转移概率矩阵预测未来的状态分布。

具体到本题,每组测试数据包括初始状态向量和转移概率矩阵。初始状态向量的三个分量分别代表“行情稳定”“行情大跌”和“行情大涨”三种状态的初始概率。转移概率矩阵是一个 3×3 的矩阵,其中每个元素 P[i][j] 表示从状态 i 转移到状态 j 的概率。为了计算第 t 步的状态概率分布,我们需要从初始状态出发,连续应用 t-1 次转移概率矩阵。这可以通过矩阵乘法的方式实现:每一步,我们都用当前状态概率分布与转移概率矩阵相乘,得到下一步的状态概率分布。

在算法实现上,针对每组测试数据,首先读取步长 t、初始状态向量以及转移概率矩阵。然后,从初始状态开始,进行 t-1 次状态转移计算。在每一次转移中,我们都根据转移概率矩阵更新各状态的概率。具体来说,对于每个可能的起始状态,我们将该状态的概率分配到下一个状态,分配的比例由转移概率决定。经过 t-1 次这样的转移后,我们得到第 t 步的状态概率分布。此时,只需检查“行情大涨”状态的概率是否超过 0.5,即可决定输出 1 或 0。

三、代码

def main():import sysinput = sys.stdin.read().split()ptr = 0T = int(input[ptr])ptr += 1for _ in range(T):t = int(input[ptr])ptr += 1state = list(map(float, input[ptr:ptr+3]))ptr += 3P = []for i in range(3):row = list(map(float, input[ptr:ptr+3]))P.append(row)ptr += 3current_state = state.copy()for _ in range(t-1):new_state = [0.0]*3for j in range(3):for k in range(3):new_state[j] += current_state[k] * P[k][j]current_state = new_stateif current_state[2] > 0.5:print(1)else:print(0)if __name__ == "__main__":main()
  1. 输入读取与解析

    • 读取输入的所有数据,并将其存储在一个列表中。

    • 使用指针 ptr 来逐个访问输入数据。

    • 第一个输入是测试数据组数 T

  2. 每组数据处理

    • 对于每组数据,首先读取步长 t

    • 接着读取初始状态向量 state,该向量包含三个元素,分别表示初始时刻处于“行情稳定”、“行情大跌”和“行情大涨”三种状态的概率。

    • 然后读取 3×3 的转移概率矩阵 P,其中每个元素 P[i][j] 表示从状态 i 转移到状态 j 的概率。

  3. 状态转移计算

    • 初始化当前状态为初始状态向量 current_state

    • 对于从第 1 步到第 t-1 步的每一步,计算下一步的状态概率分布:

      • 创建一个新的状态向量 new_state,初始化为全 0。

      • 对于每个状态 j,计算当前状态转移到状态 j 的总概率,并累加到 new_state[j] 中。

    • 将当前状态更新为新计算的状态 new_state

  4. 输出结果

    • 在完成 t-1 次转移后,检查当前状态中“行情大涨”(对应索引 2)的概率是否大于 0.5。

    • 如果大于 0.5,则输出 1;否则输出 0。

这个代码实现了对每组测试数据的输入解析、状态转移的迭代计算以及最终结果的判断和输出。

相关文章:

  • 高等数学-求导
  • 中证500股指期货的名词解释
  • 电脑中了勒索病毒如何自救
  • 自动获取ip地址安全吗?如何自动获取ip地址
  • GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo
  • Java虚拟机 -方法调用
  • CSS回顾
  • 101个α因子#22
  • GUI之按钮效果汇总
  • C++中this指针有什么用?
  • 22. 用例依赖装饰器的实现思路和方法
  • Python 列表常用函数介绍
  • 智能呼叫系统的功能
  • 零基础入门:MinerU 和 PyTorch、CUDA的关系
  • 多模态大语言模型arxiv论文略读(八十九)
  • 【paddle】常见的数学运算
  • 技术篇-2.5.Matlab应用场景及开发工具安装
  • OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()
  • 欧拉降幂(JAVA)蓝桥杯乘积幂次
  • 【机器学习】 关于外插修正随机梯度方法的数值实验
  • 表格网站源码/2024年小学生简短小新闻
  • 安徽两学一做网站/网络营销的背景和意义
  • 怎样制作时时彩网站做/如何策划一个营销方案
  • 电子商务网站建设的方法/外贸推广如何做
  • 中山建站/官网整站优化
  • 高端网站开发哪家专业/天津关键词优化平台