华为OD机试 - 最多购买宝石数目 - 滑动窗口(Python/JS/C/C++ 2024 C卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

橱窗里有一排宝石,不同的宝石对应不同的价格,宝石的价格标记为 gems[i],0<=i<n, n = gems.length

宝石可同时出售0个或多个,如果同时出售多个,则要求出售的宝石编号连续;

例如客户最大购买宝石个数为m,购买的宝石编号必须为gems[i],gems[i+1]…gemsi+m-1

假设你当前拥有总面值为value的钱,请问最多能购买到多少个宝石,如无法购买宝石,则返回 0。

二、输入描述

第一行输入n,参数类型为int,取值范围:[0,10^6],表示橱窗中宝石的总数量。

之后n行分别表示从第0个到第n-1个宝石的价格,即gems[0]到gems[n-1]的价格,类型为int,取值范围:(0,1000]。

之后一行输入v,类型为int,取值范围:[0,10^9]表示你拥有的钱。

三、输出描述

输出int类型的返回值,表示最大可购买的宝石数量。

四、测试用例

测试用例1

1、输入

7
8
4
6
3
1
6
7
10

2、输出

3

测试用例2

1、输入

9
6
1
3
1
8
9
3
2
4
15

2、输出

4

五、解题思路

  1. 使用两个指针 left 和 right 来表示滑动窗口的左右边界,初始化它们都为0。
  2. 不断尝试扩展右边界 right,直到我们无法再购买更多宝石或者超出了我们的预算。
  3. 在每次尝试扩展右边界的过程中,我们记录当前窗口内的宝石数量,并更新最大宝石数量。
  4. 如果当前窗口内的宝石总价值超过了我们的预算,我们就需要缩小窗口,即增加左边界 left,直到窗口内的宝石总价值不再超过预算或左边界 left 达到了 n - m,这是因为在这种情况下即使窗口再向右扩展也无法满足连续购买的条件。
  5. 最后,返回记录的最大宝石数量即可。

六、Python算法源码

# 导入必要的模块
import sysdef main():import sysimport sys# 读取输入input = sys.stdin.read().split()idx = 0n = int(input[idx])  # 宝石的总数量idx +=1gems = []for _ in range(n):gems.append(int(input[idx]))  # 读取每个宝石的价格idx +=1if idx < len(input):v = int(input[idx])  # 读取拥有的钱else:v =0  # 如果没有输入v,默认v为0left = 0  # 滑动窗口左边界right =0  # 滑动窗口右边界maxGems =0  # 最大可购买宝石数量sum_val =0  # 当前窗口内宝石总价值# 开始滑动窗口while right <n:sum_val += gems[right]  # 尝试扩展右边界,并更新窗口内宝石总价值right +=1# 如果当前窗口内宝石总价值超过了预算,缩小窗口while sum_val >v and left <n:sum_val -= gems[left]  # 缩小窗口,更新宝石总价值left +=1# 更新最大可购买宝石数量maxGems = max(maxGems, right - left)print(maxGems)  # 输出结果if __name__ == "__main__":main()

七、JavaScript算法源码

// 导入读取模块
const readline = require('readline');// 创建接口
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let input = [];
rl.on('line', (line) => {input.push(line);
}).on('close', () => {let idx = 0;const n = parseInt(input[idx++]); // 宝石的总数量let gems = [];for(let i=0;i<n;i++){gems.push(parseInt(input[idx++])) // 读取每个宝石的价格}const v = parseInt(input[idx++]) || 0; // 读取拥有的钱,若无输入则为0let left =0; // 滑动窗口左边界let right =0; // 滑动窗口右边界let maxGems =0; // 最大可购买宝石数量let sum =0; // 当前窗口内宝石总价值// 开始滑动窗口while(right <n){sum += gems[right]; // 尝试扩展右边界,并更新窗口内宝石总价值right++;// 如果当前窗口内宝石总价值超过了预算,缩小窗口while(sum >v && left <n){sum -= gems[left]; // 缩小窗口,更新宝石总价值left++;}// 更新最大可购买宝石数量maxGems = Math.max(maxGems, right - left);}console.log(maxGems); // 输出结果
});

八、C算法源码

#include <stdio.h>// 主函数
int main(){int n;scanf("%d", &n); // 宝石的总数量int gems[n];for(int i=0;i<n;i++){scanf("%d", &gems[i]); // 读取每个宝石的价格}long long v;scanf("%lld", &v); // 读取拥有的钱int left =0; // 滑动窗口左边界int right =0; // 滑动窗口右边界int maxGems =0; // 最大可购买宝石数量long long sum =0; // 当前窗口内宝石总价值// 开始滑动窗口while(right <n){sum += gems[right]; // 尝试扩展右边界,并更新窗口内宝石总价值right++;// 如果当前窗口内宝石总价值超过了预算,缩小窗口while(sum > v && left <n){sum -= gems[left]; // 缩小窗口,更新宝石总价值left++;}// 更新最大可购买宝石数量if(right - left > maxGems){maxGems = right - left;}}printf("%d\n", maxGems); // 输出结果return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(0);int n;cin >> n; // 宝石的总数量vector<int> gems(n);for(int &x : gems){cin >> x; // 读取每个宝石的价格}long long v;cin >> v; // 读取拥有的钱int left =0; // 滑动窗口左边界int right =0; // 滑动窗口右边界int maxGems =0; // 最大可购买宝石数量long long sum =0; // 当前窗口内宝石总价值// 开始滑动窗口while(right <n){sum += gems[right]; // 尝试扩展右边界,并更新窗口内宝石总价值right++;// 如果当前窗口内宝石总价值超过了预算,缩小窗口while(sum >v && left <n){sum -= gems[left]; // 缩小窗口,更新宝石总价值left++;}// 更新最大可购买宝石数量maxGems = max(maxGems, right - left);}cout << maxGems << "\n"; // 输出结果return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

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

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

相关文章

1:基本电路专题:R(电阻)的介绍

说实话这个其实我不想写的&#xff0c;因为这个是初中的知识&#xff0c;并没有很难&#xff0c;但是为了保持整齐性&#xff0c;我还是写了一下关于这个的知识点。是电子学中三大基本无源元件之一。&#xff08;R&#xff08;电阻&#xff09;,L&#xff08;电感&#xff09;,…

【每日一题】2020年考研数据结构 - 求最短三元组

本题要求我们在三个非空整数集合中各取一个元素构成三元组&#xff0c;使其具有最小的距离。 题目描述 定义三元组 ( ( a , b , c ) ) ((a, b, c)) ((a,b,c)) 的距离 ( D ∣ a − b ∣ ∣ b − c ∣ ∣ c − a ∣ ) (D |a - b| |b - c| |c - a|) (D∣a−b∣∣b−c∣∣…

基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“CSGO赛事管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 赛事信息界面图 赛事通知界面…

阿里云VPC机器如何访问公网

1.创建专有网络和交换机。 2.在弹性公网IP页面&#xff0c;创建弹性公网IP&#xff0c;详情请参见申请EIP。 3.在公网NAT网关页面&#xff0c;创建NAT网关&#xff0c;并绑定弹性公网IP&#xff0c; 参考&#xff1a; https://help.aliyun.com/zh/nat-gateway/getting-starte…

【QT】windows 平台 QT6.8 安装

qt-online-installer-windows-x64-4.8.1.exe Index of /qt/archive/online_installers/4.8/mirror 这里介绍了如何使用mir

CesiumJS 案例 P13:删除标记、移动标记、标记点击事件

CesiumJS CesiumJS API&#xff1a;https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库&#xff0c;它用于在网页中创建和控制 3D 地球仪&#xff08;地图&#xff09; 一、删除标记 <!DOCTYPE html> <html lang"en&…

一七二、Vue3性能优化方式

Vue 3 的性能优化相较于 Vue 2 有了显著提升&#xff0c;利用新特性和改进方法可以更高效地构建和优化应用。以下是 Vue 3 的常见性能优化方法及示例。 1. 使用组合式 API (Composition API) Vue 3 引入的组合式 API&#xff0c;通过逻辑拆分和复用来实现更高效的代码组织和性…

漏洞挖掘 | 通过域混淆绕过实现账户接管

由于这是一个私有项目&#xff0c;我将使用 example.com 来代替。 很长一段时间以来&#xff0c;我一直想在漏洞赏金项目中找到一个账户接管&#xff08;ATO&#xff09;漏洞。于是&#xff0c;我开始探索项目范围内的 account.example.com。 我做的第一件事就是注册一个新账…

Rust 基础语法与常用特性

Rust 跨界&#xff1a;全面掌握跨平台应用开发 第一章&#xff1a;快速上手 Rust 1.2 基础语法与常用特性 1.2.1 数据类型与控制流 数据类型 Rust 提供了丰富的内置数据类型&#xff0c;主要分为标量类型和复合类型。 标量类型 标量类型表示单一的值&#xff0c;Rust 中…

【linux】centos编译安装openssl1.1.1

文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先&#xff0c; centos7 通过yum安装的openssl-devel包是1.0.2k的&#xff0c;这玩意儿太老了。我们选择从源码安装op…

视觉目标检测标注xml格式文件解析可视化 - python 实现

视觉目标检测任务&#xff0c;通常用 labelimage标注&#xff0c;对应的标注文件为xml。 该示例来源于开源项目&#xff1a;https://gitcode.com/DataBall/DataBall-detections-100s/overview 读取 xml 标注文件&#xff0c;并进行可视化示例如下&#xff1a; #-*-coding:ut…

E卷-空栈压数

题目描述 向一个空栈压入正整数&#xff0c;每当压入一个整数时&#xff0c;执行以下规则(设:栈顶至栈底整数依次为 n 1 , n 2 , . . . n x n1,n2,... nx n1,n2,...nx&#xff0c;其中 n 1 n1 n1 为最新压入的整数)。 如果 n 1 n 2 n1 n2 n1n2&#xff0c;则 n 1 , n 2…

地理征服营销与开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序的融合创新

摘要&#xff1a;本文探讨了地理征服营销这一创新营销策略与开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的融合应用。首先阐述地理征服营销的概念和实施要点&#xff0c;接着介绍开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的功能与优势&#xff0c;分析二者结合如…

三周精通FastAPI:24 OAuth2 实现简单的 Password 和 Bearer 验证

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/security/simple-oauth2/ OAuth2 实现简单的 Password 和 Bearer 验证 本章添加上一章示例中欠缺的部分&#xff0c;实现完整的安全流。 获取 username 和 password 首先&#xff0c;使用 FastAPI 安全工具获…

字节青训-兔群繁殖之谜

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律&#xff1a; 每对成年兔子每个月会生育一对新的小兔子&#xff08;一雌一雄&#xff09;。新生的小兔子需要一个月成长&#xff0c;到第二个月才能开始繁殖。兔子永远不会死亡。 小 R…

appium自动化对已打开的app操作

一、说明 由于 Appium 4.x 版本对会话的管理方式发生了变化&#xff0c;直接重用会话的功能可能不再支持。你可能需要调整测试策略&#xff0c;采用新的方法与已经打开的应用进行交互&#xff0c;比如使用 ADB&#xff0c;就为了找这个我找了很久网上都没有说明&#xff0c;老…

基于STM32的智能厨房油烟监测与排风系统设计

引言 在日常烹饪过程中&#xff0c;厨房中容易产生大量油烟&#xff0c;长时间积累会对空气质量和墙面产生不良影响&#xff0c;甚至危害人体健康。智能厨房油烟监测与排风系统可以实时监测厨房内的油烟浓度&#xff0c;自动调节排风扇运行&#xff0c;确保空气清新。本文设计…

MiniWord

1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…

计算机毕业设计Python+大模型恶意木马流量检测与分类 恶意流量监测 随机森林模型 深度学习 机器学习 数据可视化 大数据毕业设计 信息安全 网络安全

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; Python大模型恶意木马流量检…

04.DDD与CQRS

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 定义职责分离DDD与CQRS的关系领域模型和查询模型特点命令场景的领域模型查询场景的查询模型 架构方案领域事件方案1&#xff1a…