跳格子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():# 输入 nn = int(input())# 输入各个位置的得分scores = list(map(int, input().split()))# 输入最大步长 kk = int(input())# 使用大根堆来存储 (得分, 位置) 对pq = []# dp[i] 表示跳到 i 可以能得到的最大得分dp = [0] * ndp[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加群”

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+Docker:高效容器化的最佳实践

首先为什么要使用 Docker&#xff1f; Docker 是一个强大的工具&#xff0c;它允许开发者将他们的应用程序打包到容器中&#xff0c;以便可以在任何平台上轻松部署和运行。当涉及到对 Spring Boot 应用程序进行 Docker 化时&#xff0c;每个开发人员都应该遵循一些最佳实践&am…

应急响应实战笔记03权限维持篇(2)

关键词&#xff1a;Windows系统后门、权限维持 在获取服务器权限后&#xff0c;通常会用一些后门技术来维持服务器权限&#xff0c;服务器一旦被植入后门&#xff0c;攻击者便如入无人之境。本文将对常见的window服务端自启动后门技术进行解析&#xff0c;知己知彼方能杜绝后门…

【计算机网络】数据链路层|封装成帧|透明传输|差错检测|PPP协议|CSMA/CD协议

目录 一、思维导图 ​ 二、数据链路层功能概述 1.数据链路层概述 2.数据链路层功能概述——封装成帧 3.数据链路层功能概述——透明传输 4.数据链路层功能概述——差错检测 三、数据链路层重要协议 1.数据链路层重要协议&#xff1a;PPP协议 2.数据链路层重要协议&#x…

Spring 类型转换、数值绑定与验证(二)—PropertyEditor与Conversion

Spring 中&#xff0c;属性类型转换是在将数值绑定到目标对象时完成的。例如在创建ApplicationContext 容器时&#xff0c;将XML配置的bean 转换成Java类型对象&#xff0c;主要是借助了PropertyEditor类&#xff0c;而在Spring MVC 的Controller的请求参数转化为特定类型时&am…

论文阅读《Sylph: A Hypernetwork Framework for Incremental Few-shot Object Detection》

论文地址&#xff1a;https://arxiv.org/abs/2203.13903 代码地址&#xff1a;https://github.com/facebookresearch/sylph-few-shot-detection 目录 1、存在的问题2、算法简介3、算法细节3.1、基础检测器3.2、小样本超网络3.2.1、支持集特征提取3.2.2、代码预测3.2.3、代码聚合…

Docker部署Mysql8.0.2

1、 搜索Mysql docker search mysql 2、 精准搜索Mysql8.0.2 docker search mysql:8.0.2 3、 拉取镜像 docker pull mysql:8.0.2 4、 启动镜像 docker run --name mysql -id -p 3306:3306 -v /temp/mysql/log:/logs -v /temp/mysql/data:/var/lib/mysql -e MYSQL_ROOT…

c++服务器开源项目Tinywebserver运行

c服务器开源项目Tinywebserver运行 一、Tinywebserver介绍二、环境搭建三、构建数据库四、编译Tinywebserver五、查看效果 Tinywebserver是github上一个十分优秀的开源项目&#xff0c;帮助初学者学习如何搭建一个服务器。 本文讲述如何在使用mysql跟该项目进行连接并将项目运行…

中科大计网学习记录笔记(十三):UDP 套接字编程 | 传输层概述和传输层的服务

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…