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

问题描述

有 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;
}

运行结果: 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024&#xff1a;默语的技术进阶与社区耕耘之旅 &#x1f31f; 默语&#xff0c;是一位在技术分享与社区建设中坚持深耕的博客作者。今年&#xff0c;我有幸再次入围成为 CSDN 博客之星TOP300 的一员&#xff0c;这既是对过往努力的肯定&#xff0c;也是对未来探…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…

Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译&#xff1f; 4.为什么要交叉编译&#xff1f; 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…

【JavaSE】(8) String 类

一、String 类常用方法 1、构造方法 常用的这4种构造方法&#xff1a;直接法&#xff0c;或者传参字符串字面量、字符数组、字节数组。 在 JDK1.8 中&#xff0c;String 类的字符串实际存储在 char 数组中&#xff1a; String 类也重写了 toString 方法&#xff0c;所以可以直…

JS(6)-数组

一.数组的基本使用 1.数组&#xff1a;把多个数据存到一组 每个数组都有编号&#xff0c;从零开始&#xff0c;数组的编号叫索引或下标&#xff0c;可以存放数字&#xff0c;字符串等。 2.取值 3.遍历数组&#xff1a;用循环的方法把每个数都访问到 a)练习 首先&#xff0c;定…

查看电脑或笔记本CPU的核心数方法及CPU详细信息

一、通过任务管理器查看 1.打开任务管理器 可以按下“Ctrl Shift Esc”组合键&#xff0c;或者按下“Ctrl Alt Delete”组合键后选择“任务管理器”来打开。 2.查看CPU信息 在任务管理器界面中&#xff0c;点击“性能”标签页&#xff0c;找到CPU使用记录区域&#xff0c…

Docker核心命令与Yocto项目的高效应用

随着软件开发逐渐向分布式和容器化方向演进&#xff0c;Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程&#xff0c;大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具&#xff0c;与 Docker 的结合进一步增强了开发…

08-Elasticsearch

黑马商城作为一个电商项目&#xff0c;商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的&#xff0c;存在很多问题。 首先&#xff0c;查询效率较低。 由于数据库模糊查询不走索引&#xff0c;在数据量较大的时候&#xff0c;查询性能很…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…

Scratch全攻略:从入门到实践的编程之旅

目录 一、Scratch 基础入门1.1 Scratch 是什么1.2 安装与界面熟悉1.2.1 在线版1.2.2 离线版1.2.2.1 舞台区1.2.2.2 角色区1.2.2.3 脚本区1.2.2.4 背景区1.2.2.5 声音区 二、核心编程要素2.1 角色与舞台2.2 积木块详解2.2.1 运动类积木2.2.2 外观类积木2.2.3 声音类积木2.2.4 事…

STM32之CubeMX新建工程操作(十八)

STM32F407 系列文章 - STM32CubeMX&#xff08;十八&#xff09; 目录 前言 一、STM32CubeMX 二、新建工程 ​编辑 1.创建工程 2.选择芯片型号 3.Pinout引脚分配 1.SYS配置 2.RCC配置 3.定时器配置 4.GPIO引脚配置 5.中断配置 6.通讯接口配置 7.插件Middleware配…

Spark任务提交流程

当包含在application master中的spark-driver启动后&#xff0c;会与资源调度平台交互获取其他执行器资源&#xff0c;并通过反向注册通知对应的node节点启动执行容器。此外&#xff0c;还会根据程序的执行规划生成两个非常重要的东西&#xff0c;一个是根据spark任务执行计划生…

GenTact Toolbox:为Franka Research 3机械臂定制触觉 “皮肤” 的创新方案

前言&#xff1a; 在机器人的发展历程中&#xff0c;为其配备全身触觉皮肤一直是一项充满挑战的任务。传统的触觉皮肤设计往往采用模块化、“一刀切” 的方式&#xff0c;虽然具备一定通用性&#xff0c;但无法充分考虑机器人独特的形状以及其操作环境的特殊需求。在复杂的现实…

设计模式Python版 单例模式

文章目录 前言一、单例模式二、单例模式实现方式三、单例模式示例四、单例模式在Django框架的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模…

JVM面试题解,垃圾回收之“对象存活判断”剖析

一、JVM怎么判断一个类/对象是不是垃圾&#xff1f; 先来说如何判断一个对象是不是垃圾 最常用的就是引用计数法和可达性分析 引用计数法 引用计数法为每个对象维护一个计数器来跟踪有多少个引用指向该对象。每当创建一个新的引用指向某个对象时&#xff0c;计数器加1&…

【Django开发】django美多商城项目完整开发4.0第14篇:Docker使用,1. 在Ubuntu中安装Docker【附

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…

14-5C++的deque容器

(一&#xff09;deque的基础知识 1.deque是“double-ended queue"的缩写和vector-样都是STL的容器 2.deque是双端数组而vector是单端的 3.deque在接口上和vector非常相似&#xff0c;在许多操作的地方可以直接替换 4.deque可以随机存取元素(支持索引值直接存取&#xf…

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)

目录 ​1&#xff09;仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2&#xff09;仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…