AI刷题-策略大师:小I与小W的数字猜谜挑战

news2025/1/23 7:01:28

问题描述

有 1, 2,..., n ,n 个数字,其中有且仅有一个数字是中奖的,这个数字是等概率随机生成的。

Alice 和 Bob 进行一个游戏:

两人轮流猜一个 1 到 n 的数字,Alice 先猜。

每完成一次猜测,主持会大声说出刚刚的数字是猜小了还是猜大了或者猜中了,若猜中则猜的人赢下游戏。

假设两人都是聪明的理智的,而且都知道对方是聪明的,求 Alice 获胜的概率,请保留 5 位小数输出答案。

输入格式

一个正整数 n

  • 100% 的数据满足 n ≤ 10^3

输出格式

保留 5 位小数输出答案。

输入样例

2

输出样例

0.50000

解题思路: 

动态规划思路

  1. 定义状态

    • 设 memo[i] 表示在有 i 个数字的情况下,Alice获胜的概率。
  2. 初始条件

    • 当只有一个数字时,Alice直接获胜,即 memo[1] = 1.0
    • 当有两个数字时,Alice有50%的概率获胜,即 memo[2] = 0.5
  3. 状态转移方程

    • 对于每个 i(从3到n),Alice可以选择猜任何一个数字 j(从1到i)。
    • 如果Alice猜 j,她获胜的概率是 memo[j-1](如果猜小了)和 memo[i-j](如果猜大了)的加权平均值。
    • 具体来说,Alice获胜的概率可以表示为:
      [
      memo[i] = \max_{1 \leq j \leq i} \left( \frac{1}{i} + \frac{j-1}{i} \cdot (1 - memo[j-1]) + \frac{i-j}{i} \cdot (1 - memo[i-j]) \right)
      ]
  4. 计算顺序

    • 从 i = 3 开始,逐步计算到 i = n
  5. 最终结果

    • memo[n] 即为Alice在有 n 个数字的情况下获胜的概率。

 

 代码实现:

 1.首先是特判的部分:在1和2的时候答案是固定的
if (n == 1)
        return "1.00000";
    if (n == 2)
        return "0.50000";
2. 初始化:创建vector数组来做dp,同时把1和2的值放入数组

 

vector<double> memo(n + 1, 0.0);
    memo[1] = 1.0;
    memo[2] = 0.5;
3.状态更新:

整个表达式 1.0 / i + ((double)(j - 1) / i * (1 - memo[j - 1])) + ((double)(i - j) / i * (1 - memo[i - j])) 表示 Alice 选择猜数字 j 时,她获胜的总概率。这个概率是以下三部分的和:

  1. 猜中数字 j 的概率。
  2. 猜的数字 j 比中奖数字小的情况下,Alice 在剩下的 j - 1 个数字中获胜的概率。
  3. 猜的数字 j 比中奖数字大的情况下,Alice 在剩下的 i - j 个数字中获胜的概率。
 对于直接猜中的:

1.0 / i是猜中一个数字的基础概率; 

对于猜到小的:((double)(j - 1) / i * (1 - memo[j - 1]))

(j - 1) / i 是猜的数字 j 比中奖数字小的概率 

(1 - memo[j - 1]) 是如果猜的数字 j 比中奖数字小,Alice 在剩下的 j - 1 个数字中获胜的概率。 

猜到大的: ((double)(i - j) / i * (1 - memo[i - j]))

(i - j) / i 是猜的数字 j 比中奖数字大的概率。

(1 - memo[i - j]) 是如果猜的数字 j 比中奖数字大,Alice 在剩下的 i - j 个数字中获胜的概率。

 

for (int i = 3; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            memo[i] = std::max(memo[i], 1.0 / i + ((double)(j - 1) / i * (1 - memo[j - 1]))
                    + ((double)(i - j) / i * (1 - memo[i - j])));
        }
    }

最终代码: 

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <algorithm>

std::string solution(int n) {
    // Please write your code here
    if (n == 1)
        return "1.00000";
    if (n == 2)
        return "0.50000";
    
    std::vector<double> memo(n + 1, 0.0);
    memo[1] = 1.0;
    memo[2] = 0.5;
    
    for (int i = 3; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            memo[i] = std::max(memo[i], 1.0 / i + ((double)(j - 1) / i * (1 - memo[j - 1]))
                    + ((double)(i - j) / i * (1 - memo[i - j])));
        }
    }
    
    std::ostringstream oss;
    oss << std::fixed << std::setprecision(5) << memo[n];
    return oss.str();
}

int main() {
    // You can add more test cases here
    std::cout << (solution(2) == "0.50000") << std::endl;
    std::cout << (solution(931) == "0.50054") << std::endl;
    std::cout << (solution(924) == "0.50000") << std::endl;
    std::cout << (solution(545) == "0.50092") << std::endl;

    return 0;
}

运行结果: 

 

 

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

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

相关文章

利用Java爬虫获取eBay商品详情:代码示例与教程

在当今的电商时代&#xff0c;获取商品详情数据对于市场分析、价格监控和竞品研究至关重要。eBay作为全球最大的电商平台之一&#xff0c;拥有海量的商品信息。通过Java爬虫技术&#xff0c;我们可以高效地获取这些数据&#xff0c;为商业决策提供支持。本文将详细介绍如何使用…

编译Android平台使用的FFmpeg库

目录 前言 一、编译环境 二、搭建环境 1.安装MSYS2 2.更新系统包 2.1 打开MSYS2 MinGW 64-bit终端&#xff08;mingw64.exe&#xff09; 2.2 更新所有软件包到最新版本 2.3 安装必要的工具和库。 3. 克隆FFmpeg源码 4. 配置编译选项 5. 执行编译 总结 前言 记录学习…

30天开发操作系统 第 17 天 -- 命令行窗口

前言 今天一开始&#xff0c;请大家先回忆一下任务A的情形。在harib13e中&#xff0c;任务A下面的LEVEL中有任务因此FIFO为空时我们可以让任务A进入休眠状态。那么&#xff0c;如果我们并未启动任务B0~ B0~ B2, B2的话&#xff0c;任务A又将会如何呢&#xff1f; 首先&#xf…

阿九的python 爬虫进阶课18.3 学习笔记

文章目录 前言1. 爬取大标题2. 爬取小标题3. 证券栏下的标题4. 某篇文章里的具体内容 前言 网课链接&#xff1a;https://www.bilibili.com/video/BV1kV4y1576b/新浪财经网址&#xff1a;https://finance.sina.com.cn/需先下载库&#xff1a; conda install lxml布置爬取的一…

Qt 5.14.2 学习记录 —— 십팔 对话框

文章目录 1、Qt对话框2、自定义对话框1、代码方式2、图形化方式 3、模态对话框4、QMessageBox5、QColorDialog6、QFileDialog7、QFontDialog8、QInputDialog 1、Qt对话框 Qt的对话框用QDialog类来表示&#xff0c;可以自定义一些类来实现自定义对话框&#xff0c;但需要继承自…

web3py+flask+ganache的智能合约教育平台

最近在学习web3的接口文档&#xff0c;使用web3pyflaskganache写了一个简易的智能合约教育平台&#xff0c;语言用的是python&#xff0c;ganche直接使用的本地区块链网络&#xff0c;用web3py进行交互。 代码逻辑不难&#xff0c;可以私信或者到我的闲鱼号夏沫mds获取我的代码…

java中的String类、StringBuffer类、StringBuilder类的详细讲解(包含相互之间的比较)

文章目录 一、String 类1 String 类的介绍2 String 对象创建的两种方式3 测试题加深理解&#xff08;1&#xff09; 例题一&#xff08;2&#xff09;例题二&#xff08;3&#xff09; 例题三 4 String 类的常用方法&#xff08;1&#xff09;equals()&#xff08;2&#xff09…

外设链接与中断

外设链接与中断 PC键盘处理过程 定制键盘的输入过程

考研408笔记之数据结构(五)——图

数据结构&#xff08;五&#xff09;——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中&#xff0c;使用圆括号表示一条边&#xff0c;圆括号里元素位置互换没有影响。 在无向图中&#xff0c;使用尖括号表示一条边&#xff0c;尖括号里元素位置互换则表示…

71,【3】buuctf web [HITCON 2017]SSRFme

进入靶场 左上角是IP地址&#xff0c;下面有一堆代码 <?php // 检查是否存在 HTTP_X_FORWARDED_FOR 头部信息 if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {// 如果存在&#xff0c;将其按逗号分隔&#xff0c;并将第一个元素作为新的 REMOTE_ADDR$http_x_headers explo…

【TypeScript】模块化和命名空间、类型查找、类型缩小

模块化和命名空间 ts 在模块化中遵循 esm 规范&#xff0c;而且推荐导入类型时前面加上 type 字段&#xff0c;这些可以让一个非TypeScript编译器比如Babel、swc或者esbuild知道什么样的导入可以被安全移除。 TypeScript有它自己的模块格式&#xff0c;名为namespaces&#x…

城市生命线安全保障:技术应用与策略创新

城市生命线工程是维系城市正常运行、满足群众生产生活需要的重要基础设施。随着城市化进程的加快&#xff0c;城市基础设施生命线安全运行的复杂性日益加剧&#xff0c;保障城市居民日常生活正常运行的水、电、气、热等各类地下管线以及桥梁、市政设施、轨道交通等城市基础设施…

MVCC在MySQL中实现无锁的原理

一&#xff1a;基础知识 我们知道MySQL是多线程并发处理任务的。MySQL使用了MVCC来实现事务并发的无锁机制。 而且我们还需要知道MySQL的四种隔离级别&#xff1a;读未提交&#xff0c;读已提交&#xff08;RC&#xff09;&#xff0c;可重复读&#xff08;RR&#xff09;&am…

WPF实战案例 | C# WPF实现大学选课系统

WPF实战案例 | C# WPF实现大学选课系统 一、设计来源1.1 主界面1.2 登录界面1.3 新增课程界面1.4 修改密码界面 二、效果和源码2.1 界面设计&#xff08;XAML&#xff09;2.2 代码逻辑&#xff08;C#&#xff09; 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&a…

HTML5 Canvas和JavaScript的3D粒子星系效果

HTML部分 基本结构包括<html>, <head>, 和 <body>标签。<title>标签设置了页面标题为“优化版3D粒子星系”。<style>块定义了一些基本样式&#xff1a; body&#xff1a;无边距&#xff0c;隐藏滚动条&#xff0c;黑色背景&#xff0c;禁用触摸…

再见 Crontab!Linux 定时任务的新选择!

引言 说到 Linux 下定时执行任务&#xff0c;大多数人可能会想到 crontab&#xff1f;没错&#xff0c;它的确是 Linux 下比较通用和方便的方式&#xff0c;但是今天我来介绍一种新的方法来创建定时任务并且支持更多更强大的功能。 Systemd 很多小伙伴应该听说过 Systemd&…

Unity入门1

安装之后无法获得许可证&#xff0c;可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用&#xff0c;重开vstu&#xff0c;或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…

【二叉树】遍历总结!

在很多问题中&#xff0c;熟练掌握二叉树的遍历方法&#xff0c;能够轻松解决很多问题。 新建一棵二叉树root[1,null,2,3] 1、前序遍历 前序遍历的顺序为根节点->左子树->右子树&#xff0c;按照以上二叉树&#xff0c;遍历顺序为[1&#xff0c;2&#xff0c;3]。代码为…

(2)STM32 USB设备开发-USB虚拟串口

例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为USB虚拟串口教程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的&#xff0c;如果代码中出现一些外设的…

ASP .NET Core 学习(.NET9)部署(一)windows

在windows部署 ASP .NET Core 的时候IIS是不二选择 一、IIS安装 不论是在window7 、w10还是Windows Server&#xff0c;都是十分简单的&#xff0c;下面以Windows10为例 打开控制面版—程序—启用或关闭Windows功能 勾选图中的两项&#xff0c;其中的子项看需求自行勾选&am…