跳格子3 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

小明和朋友们一起玩跳格子游戏,每个格子上有特定的分数,score[] = [1 -1 -6 7 -17 7],

从起点score[0]开始,每次最大跳的步长为k,请你返回小明跳到终点score[n-1]时,能得到的最大得分 。

注:

  • 格子的总长度和步长的区间在 [1, 100000];
  • 每个格子的分数在[-10000, 10000]区间中;

输入描述

6 // 第一行输入总的格子数量

1 -1 -6 7 -17 7 // 第二行输入每个格子的分数score[]

2 // 第三行输入最大跳的步长k

输出描述

14 // 输出最大得分数,小明从起点score[0]开始跳,第一次跳score[1], 第二次跳到score[3],第三次跳到score[5],因此得到的最大的得分是score[0] + score[1] + score[3] + score[5] = 14

示例1

输入:
6
1 -1 -6 7 -17 7
2

输出:
14

题解

题目类型: 动态规划问题,使用优先级队列来优化。

解题思路: 动态规划问题,定义状态和状态转移方程。使用优先级队列(大根堆)来维护前面格子已经获得的最大得分,保证每次选择最大得分的格子进行跳跃。

代码大致描述:

  • 输入格子数量 n,每个格子的分数 scores,以及最大跳步长 k。
  • 初始化优先级队列 pq,用于存储 (得分, 位置) 对,根据得分从大到小排序。
  • 初始化 dp 数组,dp[i] 表示跳到位置 i 时可以获得的最大得分。
  • 遍历格子,计算每个位置的最大得分,并使用优先级队列维护前面格子的最大得分信息。
  • 输出 dp 数组的最后一个元素,即到达终点时的最大得分。

时间复杂度: O(n log n),其中 n 为格子的数量。因为在每一步都需要操作优先级队列,插入和删除的时间复杂度为 O(log n)。

空间复杂度: O(n),用于存储 dp 数组和优先级队列。

Java

import java.util.PriorityQueue;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        int[] scores = new int[n];
        for (int i = 0; i < n; i++) scores[i] = in.nextInt();

        // 最大步长
        int k = in.nextInt();

        // 优先级队列用于维护前面格子已经获得的最大得分
        // 存储格式 {得分, 位置}
        PriorityQueue<int[]> pq = new PriorityQueue<>((a1, a2) -> a2[0] - a1[0]);

        // dp[i] 表示跳到 i 可以能得到的最大得分
        int[] dp = new int[n];
        dp[0] = scores[0];
        pq.offer(new int[]{dp[0], 0});
		
        // 遍历数组,计算每个位置的最大得分
        for (int i = 1; i < n; i++) {
            // 不能从  pq.peek()[1] 步跳到 i,因此抛弃
            while (!pq.isEmpty() && i - pq.peek()[1] > k) pq.poll();
			
            // 计算当前位置的最大得分
            dp[i] = pq.peek()[0] + scores[i];
            pq.offer(new int[]{dp[i], i});
        }

        System.out.println(dp[n - 1]);
    }
}

Python

import heapq

# 主函数
def main():
    # 输入 n
    n = int(input())
    
    # 输入各个位置的得分
    scores = list(map(int, input().split()))

    # 输入最大步长 k
    k = int(input())

    # 使用大根堆来存储 (得分, 位置) 对
    pq = []
    
    # dp[i] 表示跳到 i 可以能得到的最大得分
    dp = [0] * n
    dp[0] = scores[0]
    
    # 将第一个位置的得分和位置加入最大堆
    heapq.heappush(pq, (-dp[0], 0))

    # 遍历数组,计算每个位置的最大得分
    for i in range(1, n):
        # 不能从 pq[0][1] 步跳到 i,因此抛弃
        while pq and i - pq[0][1] > k:
            heapq.heappop(pq)

        # 计算当前位置的最大得分
        dp[i] = -pq[0][0] + scores[i]
        
        # 将当前位置的得分和位置加入最大堆
        heapq.heappush(pq, (-(dp[i]), i))

    # 输出最后一个位置的最大得分
    print(dp[n - 1])

# 调用主函数
if __name__ == "__main__":
    main()

C++

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, k;
    cin >> n;
    vector<int> scores(n);
    for(size_t i = 0; i < n; i++) cin >> scores[i];

    // 最大步长
    cin >> k;

    priority_queue<pair<int, int>> pq;
    // dp[i] 表示跳到 i 可以能得到的最大得分
    vector<int> dp(n, 0);
    dp[0] = scores[0];
    pq.push({dp[0], 0});

    for(size_t i = 1; i < n; i++){
        // 不能从  pq.top().second 步跳到 i,因此抛弃
        while(!pq.empty() && i - pq.top().second > k) pq.pop();

        dp[i] = pq.top().first + scores[i];
        pq.push({dp[i], i});
    }

    cout << dp[n - 1] << endl;
    
    return 0;
}    

相关练习题

题号题目难易
LeetCode 4545. 跳跃游戏 II中等
LeetCode 13061306. 跳跃游戏 III中等
LeetCode 16961696. 跳跃游戏 VI中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

petalinux_zynq7 驱动DAC以及ADC模块之四:python实现http_api

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

MongoDB学习笔记

1. 写在前面 最近工作用到了Mongodb&#xff0c;虽然有了gpt&#xff0c;对于这种数据库操作的代码基本上不用自己费多大功夫&#xff0c;但对于知识本身&#xff0c;还是想借机会系统学习下Mongodb的&#xff0c;原因是之前接触数据库一直都是mysql&#xff0c;oracle等关系型…

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

Linux java查看内存消耗 linux查看java程序内存(转载)

Linux java查看内存消耗 linux查看java程序内存 目录 一、jps命令。 二、ps命令。 三、top命令。 四、free命令。 五、df命令。 查看应用的CPU、内存使用情况&#xff0c;使用jps、ps、top、free、df命令查看。 一、jps命令。 可以列出本机所有java应用程序的进程pid。…

浏览器显示「SSL 证书无效」应该如何解决?

作为保护网站传输数据安全的重要工具&#xff0c;SSL证书经常被部署于网站服务器上以实现HTTPS加密。但部分网站部署SSL证书后&#xff0c;访问时有时候会出现SSL 证书无效警示。那么SSL证书无效怎么办&#xff1f;导致SSL证书无效的情况可能是SSL证书本身的原因&#xff0c;也…

轻松掌握opencv的8种图像变换

文章目录 opencv的8种图像变换1. 图像放大、缩小2. 图像平移3. 图像旋转4. 图像仿射变换5. 图像裁剪6. 图像的位运算&#xff08;AND, OR, XOR&#xff09;7. 图像的分离和融合8. 图像的颜色空间 opencv的8种图像变换 1. 图像放大、缩小 我们先看下原图 import cv2 import ma…

【论文精读】IBOT

摘要 掩码语言建模(MLM)是一种流行的语言模型预训练范式&#xff0c;在nlp领域取得了巨大的成功。然而&#xff0c;它对视觉Transformer (ViT)的潜力尚未得到充分开发。为在视觉领域延续MLM的成功&#xff0c;故而探索掩码图像建模(MIM)&#xff0c;以训练更好的视觉transforme…

mysql 自定义函数create function

方便后续查询&#xff0c;做以下记录&#xff1b; 自定义函数是一种与存储过程十分相似的过程式数据库对象&#xff0c; 它与存储过程一样&#xff0c;都是由 SQL 语句和过程式语句组成的代码片段&#xff0c;并且可以被应用程序和其他 SQL 语句调用。 自定义函数与存储过程之间…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

无法打开源文件 “csignal“ (dependency of “rclcpp/rclcpp.hpp“).等错误解决方法

#include "rclcpp/rclcpp.hpp"无法打开源文件的问题 报错情况解决流程1、ctrlshiftp2、修改编辑配置3、结果 在进行ros2编程的过程中&#xff0c;出现上述错误&#xff0c;网上没有找到解决方法&#xff0c;为后来者记录下解决经验&#xff0c;少走弯路&#xff0c;节…

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…

基于springboot+vue的植物健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

信号滤波在PID闭环控制中的作用(对比测试实验)

信号滤波在工业中的应用不用多说&#xff0c;这篇博客我们通过PID仿真测试实验&#xff0c;对比分析信号滤波在PID闭环控制中的作用。我们实验里需要用到的PLC算法模块大家可以查看下面文章链接&#xff1a; 1、博途PLC 信号发生器模块 https://rxxw-control.blog.csdn.net/a…

制造业客户数据安全解决方案(数据防泄密需求分析)

机械行业是历史悠久的工业形式&#xff0c;与国民经济密切相关&#xff0c;属于周期性行业&#xff0c;是我国最重要的工业制造行业之一。即使网络经济与IT信息技术在世界范围内占据主导地位&#xff0c;依然离不开一个发达的、先进的物质基础&#xff0c;而机械行业正是为生成…

CSS实现半边边框(只有边框的部分可见)

CSS实现半边边框&#xff08;只有边框的部分可见&#xff09; <div class"part box"><h1>内容</h1><!-- 绘出下面两个对角边框--><div class"part-footer"></div> </div>主要代码 .box {width: 100px;height:…

leetcode hot100打家劫舍三

本题是打家劫舍的变形&#xff0c;数据结构是树形。涉及到树的题目一定要想清楚树的遍历顺序&#xff08;前中后序&#xff09;。之后再考虑利用动态规划来解决。 动态规划是一直记录状态&#xff0c;我们可以根据动态规划的数组来记录变化的状态&#xff0c;最终求的自己想要…

Surely Vue Table表格css、js方法去除水印

文章目录 Surely Vue Table表格css、js方法去除水印用法 css 去除js去除 Surely Vue Table表格css、js方法去除水印 "surely-vue/table": "^4.2.7","ant-design-vue": "^2.1.2",用法 在main.ts文件中全局引入 import STable from su…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开发板 LED 部分原理图看到…

VSCode-更改系统默认路径

修改vscode中的默认扩展路径&#xff1a;"%USERPROFILE%\.vscode" 打开目录C:\用户\电脑用户名&#xff0c;将.vscode文件剪切至D:\VSCode文件夹下 用管理员身份打开cmd.exe命令界面输入mklink /D "%USERPROFILE%\.vscode" "D:\VSCode\.vscode\"…

[corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape

前言 题目来源&#xff1a;竞赛官网 – 建议这里下载&#xff0c;文件系统/带符号的 vmlinux 给了 参考 [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape Exploiting poll_list Objects In The Linux Kernel – 原作者文章&#xff0c;poll_list 利用方式…