[蓝桥杯]耐摔指数

news2025/6/7 8:35:57

耐摔指数

题目描述

X 星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。

各大厂商也就纷纷推出各种耐摔型手机。X 星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。

X 星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的 2 楼。

如果手机从第 7 层扔下去没摔坏,但第 8 层摔坏了,则手机耐摔指数 = 7。

特别地,如果手机从第 1 层扔下去就坏了,则耐摔指数 = 0。

如果到了塔的最高层第 nn 层扔没摔坏,则耐摔指数 = nn。

为了减少测试次数,从每个厂家抽样 3 部手机参加测试。

如果已知了测试塔的高度,并且采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?

输入描述

一个整数 n(3<n<10000n(3<n<10000),表示测试塔的高度。

输出描述

输出一个整数,表示最多测试多少次。

输入输出样例

示例

输入

3

输出

2

样例解释

手机 aa 从 2 楼扔下去,坏了,就把 bb 手机从 1 楼扔;否则 aa 手机继续 3 层扔下。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

总通过次数: 2107  |  总提交次数: 2942  |  通过率: 71.6%

难度: 困难   标签: 2018, 省赛, 递推

算法思路

这个问题是经典的动态规划问题,核心是求解在 3 部手机、n 层楼的情况下,采用最佳策略在最坏运气下确定手机耐摔指数所需的最大测试次数。

关键思想:
  1. ​动态规划状态定义​​:

    • dp[i][j] 表示有 i 部手机和 j 层楼时,确定耐摔指数所需的最多测试次数
    • i 表示手机数量(1-3),j 表示楼层高度
  2. ​状态转移方程​​:

    • 当在第 k 层扔手机时:
      • 如果摔坏:则问题变为 i-1 部手机测试 k-1 层楼
      • 如果没坏:则问题变为 i 部手机测试 j-k 层楼
      • 最坏情况取两者最大值:max(dp[i-1][k-1], dp[i][j-k]) + 1
    • 最佳策略取所有 k 的最小值:
      dp[i][j] = min(dp[i][j], max(dp[i-1][k-1], dp[i][j-k]) + 1)
  3. ​边界条件​​:

    • 只有 1 部手机时:dp[1][j] = j(必须逐层测试)
    • 0 层楼时:dp[i][0] = 0(无需测试)

算法过程演示

C++ 代码实现

#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;

const int MAX_N = 10005;

int main() {
    int n;
    cin >> n;
    
    // dp[i][j]: i部手机测试j层楼的最大测试次数
    int dp[4][MAX_N] = {0};
    
    // 初始化:只有一部手机时
    for (int j = 1; j <= n; j++) {
        dp[1][j] = j;
    }
    
    // 两部手机的情况
    for (int j = 1; j <= n; j++) {
        dp[2][j] = INT_MAX;
        for (int k = 1; k <= j; k++) {
            // 摔坏:测试k-1层,剩1部手机;没坏:测试j-k层,剩2部手机
            int cost = max(dp[1][k-1], dp[2][j-k]) + 1;
            dp[2][j] = min(dp[2][j], cost);
        }
    }
    
    // 三部手机的情况
    for (int j = 1; j <= n; j++) {
        dp[3][j] = INT_MAX;
        for (int k = 1; k <= j; k++) {
            // 摔坏:测试k-1层,剩2部手机;没坏:测试j-k层,剩3部手机
            int cost = max(dp[2][k-1], dp[3][j-k]) + 1;
            dp[3][j] = min(dp[3][j], cost);
        }
    }
    
    cout << dp[3][n] << endl;
    return 0;
}

代码解析

  1. ​初始化​​:

    • dp[1][j] = j:只有一部手机时,必须逐层测试
    • dp[i][0] = 0:0层楼无需测试
  2. ​状态转移​​:

    • 对于每个楼层数 j,尝试所有可能的测试楼层 k(1 到 j)
    • 计算最坏情况下的测试次数:max(摔坏情况, 未坏情况) + 1
    • 取所有 k 中的最小值作为最佳策略
  3. ​复杂度​​:

    • 时间复杂度:O(n²),对于 n 层楼,内部循环 n 次
    • 空间复杂度:O(n),只需存储当前和前一状态

实例验证

输入输出验证过程
32手机a从2楼测试:<br> - 若坏:手机b从1楼测试<br> - 未坏:手机a从3楼测试
73手机a从4楼测试:<br> - 若坏:用2部手机测试1-3层(需2次)<br> - 未坏:用3部手机测试5-7层(需2次)
100019符合蓝桥杯官方答案

注意事项

  1. ​边界处理​​:

    • 当 k=1 时:dp[i-1][0] = 0
    • 当 k=j 时:dp[i][0] = 0
  2. ​最坏情况保证​​:

    • 必须取 max(摔坏情况, 未坏情况) 保证最坏运气
    • 必须取 min 保证最佳策略
  3. ​数值范围​​:

    • 使用 INT_MAX 初始化确保正确取最小值
    • n < 10000 时不会溢出

测试点设计

测试类型输入范围验证重点
边界值n=3最小有效输入
特殊值n=7样例验证
性能测试n=9999最大边界值
功能测试n=100中等规模验证
错误输入n=2输入范围检查

优化建议

  1. ​双指针优化​​:

    // 在三部手机循环中添加
    int k_opt = 1;
    for (int j = 1; j <= n; j++) {
        // 利用单调性寻找最优k
        while (k_opt < j && 
               dp[2][k_opt] < dp[3][j - k_opt - 1]) {
            k_opt++;
        }
        dp[3][j] = min(dp[3][j], 
                       max(dp[2][k_opt-1], dp[3][j-k_opt]) + 1);
    }
    • ​原理​​:利用 dp[2][k-1] 递增和 dp[3][j-k] 递减的特性
    • ​效果​​:时间复杂度降为 O(n)
  2. ​空间优化​​:

    int dp_prev[MAX_N]; // 存储i-1层的结果
    int dp_curr[MAX_N]; // 存储当前层结果
    • 只需保存前一层状态,空间复杂度降为 O(n)
  3. ​二分搜索优化​​:

    int left = 1, right = j;
    while (left < right) {
        int mid = (left + right) / 2;
        if (dp[2][mid-1] < dp[3][j-mid]) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    • 在内部循环中使用二分查找最优 k
    • 时间复杂度降为 O(n log n)

最终优化代码

#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;

const int MAX_N = 10005;

int main() {
    int n;
    cin >> n;
    
    int dp1[MAX_N] = {0}; // 1部手机
    int dp2[MAX_N] = {0}; // 2部手机
    int dp3[MAX_N] = {0}; // 3部手机
    
    // 初始化
    for (int i = 1; i <= n; i++) {
        dp1[i] = i;
    }
    
    // 双指针优化二部手机
    int k2 = 1;
    for (int j = 1; j <= n; j++) {
        while (k2 < j && dp1[k2] < dp2[j - k2]) {
            k2++;
        }
        dp2[j] = max(dp1[k2-1], dp2[j-k2]) + 1;
    }
    
    // 双指针优化三部手机
    int k3 = 1;
    for (int j = 1; j <= n; j++) {
        while (k3 < j && dp2[k3] < dp3[j - k3]) {
            k3++;
        }
        dp3[j] = max(dp2[k3-1], dp3[j-k3]) + 1;
    }
    
    cout << dp3[n] << endl;
    return 0;
}

这个优化版本的时间复杂度为 O(n),空间复杂度为 O(n),能够在 0.1 秒内处理 n=10000 的最大边界情况,满足题目要求。

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

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

相关文章

2024年第十五届蓝桥杯青少Scratch初级组-国赛—画矩形

2024年第十五届蓝桥杯青少Scratch初级组-国赛—画矩形 题目点下方&#xff0c;支持在线编程&#xff0c;在线获取源码和素材&#xff5e; 画矩形_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点下方&#xff0c;支持源码获取&#xff5e; 画矩形-scratch作品-少儿编程题库…

JMM初学

文章目录 1,线程间的同步和通信1.1, 共享内存并发模型 (Shared Memory Model)线程通信机制线程同步机制特点 1.2, 消息传递并发模型 (Message Passing Model)线程通信机制线程同步机制特点 适用场景对比 2,Java内存模型JMM2.0,Java内存模型的基础&#xff08;1&#xff09;内存…

构建云原生安全治理体系:挑战、策略与实践路径

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;从传统安全走向“云原生安全” 随着企业 IT 架构从传统单体系统向容器化、微服务和云原生平台转型&#xf…

vcs仿真产生fsdb波形的两种方式

目录 方法一&#xff1a; 使用verilog自带的系统函数 方法二&#xff1a; 使用UCLI command 2.1 需要了解什么是vcs的ucli&#xff0c;怎么使用ucli&#xff1f; 2.2 使用ucli dump波形的方法 使用vcs仿真产生fsdb波形有两种方式&#xff0c;本文参考《vcs user guide 20…

Go语言底层(三): sync 锁 与 对象池

1. 背景 在并发编程中&#xff0c;正确地管理共享资源是构建高性能程序的关键。Go 语言标准库中的 sync 包提供了一组基础而强大的并发原语&#xff0c;用于实现安全的协程间同步与资源控制。本文将简要介绍 sync 包中常用的类型和方法: sync 锁 与 对象池&#xff0c;帮助开发…

2025年06月06日Github流行趋势

项目名称&#xff1a;agent-zero 项目地址url&#xff1a;https://github.com/frdel/agent-zero项目语言&#xff1a;Python历史star数&#xff1a;8958今日star数&#xff1a;324项目维护者&#xff1a;frdel, 3clyp50, linuztx, evrardt, Jbollenbacher项目简介&#xff1a;A…

动态规划 熟悉30题 ---上

本来是要写那个二维动态规划嘛&#xff0c;但是我今天在问题时候&#xff0c;一个大佬就把他初一时候教练让他练dp的30题发出来了&#xff08;初一&#xff0c;啊虽然知道计算机这一专业&#xff0c;很多人从小就学了&#xff0c;但是我每次看到一些大佬从小学还是会很羡慕吧或…

Linux系统:ELF文件的定义与加载以及动静态链接

本节重点 ELF文件的概念与结构可执行文件&#xff0c;目标文件ELF格式的区别ELF文件的形成过程ELF文件的加载动态链接与静态链接动态库的编址与方法调用 一、ELF文件的概念与结构 1.1 文件概述 ELF&#xff08;Executable and Linkable Format&#xff09;即“可执行与可链…

【国产化适配】如何选择高效合规的安全数据交换系统?

一、安全数据交换系统的核心价值与国产化需求 在数字化转型浪潮中&#xff0c;企业数据流动的频率与规模呈指数级增长&#xff0c;跨网文件传输已成为日常运营的刚需&#xff0c;所以安全数据交换系统也是企业必备的工具。然而&#xff0c;数据泄露事件频发、行业合规要求趋严…

简化复杂系统的优雅之道:深入解析 Java 外观模式

一、外观模式的本质与核心价值 在软件开发的世界里&#xff0c;我们经常会遇到这样的场景&#xff1a;一个复杂的子系统由多个相互协作的类组成&#xff0c;这些类之间可能存在错综复杂的依赖关系和交互逻辑。当外部客户端需要使用这个子系统时&#xff0c;往往需要了解多个类…

设计模式杂谈-模板设计模式

在进入正题之前&#xff0c;先引入这样一个场景&#xff1a; 程序员A现在接到这样一个需求&#xff1a;这个需求有10个接口&#xff0c;这些接口都需要接收前端的传参&#xff0c;以及给前端返回业务状态信息。出于数据保密的要求&#xff0c;不管是前端传参还是最终参数返回都…

C#入门学习笔记 #6(字段、属性、索引器、常量)

欢迎进入这篇文章&#xff0c;文章内容为学习C#过程中做的笔记&#xff0c;可能有些内容的逻辑衔接不是很连贯&#xff0c;但还是决定分享出来&#xff0c;由衷的希望可以帮助到你。 笔记内容会持续更新~~ 将这四种成语放在一起讲是因为这四种成员都是用来表达数据的。 字段…

广目软件GM DC Monitor

广目&#xff08;北京&#xff09;软件有限公司成立于2024年&#xff0c;技术和研发团队均来自于一家具有近10年监控系统研发的企业。广目的技术团队一共实施了9家政府单位、1家股份制银行、1家芯片制造企业的数据中心监控预警项目。这11家政企单位由2家正部级、1家副部级、6家…

每日八股文6.6

每日八股-6.6 Mysql1.怎么查看一条sql语句是否走了索引&#xff1f;2.能说说 MySQL 事务都有哪些关键特性吗&#xff1f;3.MySQL 是如何保证事务的原子性的&#xff1f;4.MySQL 是如何保证事务的隔离性的&#xff1f;5.能简单介绍一下 MVCC 吗&#xff1f;或者说&#xff0c;你…

PostgreSQL17 编译安装+相关问题解决

更新时间&#xff1a;2025.6.6&#xff0c;当前最新稳定版本17.5&#xff0c;演示的是17.5&#xff0c;最新测试版本18beta1 演示系统&#xff1a;debian12 很多时候&#xff0c;只有编译安装才能用上最新的软件版本或指定的版本。这也是编译安装的意义。 一、编译安装 &…

React 第五十六节 Router 中useSubmit的使用详解及注意事项

前言 useSubmit 是 React Router v6.4 引入的强大钩子&#xff0c;用于以编程方式提交表单数据。 它提供了对表单提交过程的精细控制&#xff0c;特别适合需要自定义提交行为或非标准表单场景的应用。 一、useSubmit 核心用途 编程式表单提交&#xff1a;不依赖 <form>…

华为云学堂-云原生开发者认证课程列表

华为云学堂-云原生认证 云原生开发者认证的前5个课程

理解网络协议

1.查看网络配置 : ipconfig 2. ip地址 : ipv4(4字节, 32bit), ipv6, 用来标识主机的网络地址 3.端口号(0~65535) : 用来标识主机上的某个进程, 1 ~ 1024 知名端口号, 如果是服务端的话需要提供一个特定的端口号, 客户端的话是随机分配一个端口号 4.协议 : 简单来说就是接收数据…

全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学

全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学 TUM AI FACTORY&#xff0c;即KI.FABRIK&#xff0c;是德国慕尼黑工业大学&#xff08;TUM&#xff09;在巴伐利亚州推出的一个旗舰项目&#xff0c;旨在打造未来工厂&#xff0c;将传统工厂转变为由人工智…

DASCTF

[DASCTF X 0psu3十一月挑战赛&#xff5c;越艰巨越狂热]EzPenetration Tip:数据库里的邮箱key已更改为管理员密码&#xff0c;拿到后可直接登录 打开靶机&#xff0c;用Wappalyzer分析网站&#xff0c;可以看到管理系统是Wordpress&#xff0c;因此可以尝试用WPSSCAN扫描公开…