最新华为OD机试真题-宝石购买计划(100分)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-D卷的三语言AC题解

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

=> 宝石购买计划(100分) <=

华为OD

🌍 评测功能需要 =>订阅专栏<= 后联系清隆解锁~

🍓OJ题目截图

alt

🍊 宝石购买计划

题目描述

K小姐经营着一家珠宝店,店里的橱窗中陈列着一排 颗宝石。每颗宝石都有各自的价格,第 颗宝石的价格为 。宝石可以同时出售 个或多个,但如果要同时出售多颗宝石,则这些宝石在橱窗中的位置必须连续。例如,如果顾客最多购买 颗宝石,那么他可以选择购买的宝石编号为

现在,K小姐手中有 元钱,她想知道自己最多能购买到多少颗宝石。如果没有足够的钱购买任何宝石,则返回

输入格式

第一行包含一个正整数 ,表示橱窗中宝石的总数量。

接下来的 行,每行包含一个正整数,分别表示从第 颗宝石到第 颗宝石的价格,即

最后一行包含一个正整数 ,表示K小姐手中的钱数。

输出格式

输出一个整数,表示K小姐最多能购买到的宝石数量。

样例输入

7
8
4
6
3
1
6
7
10

样例输出

3

样例解释

最多可以购买的宝石为 或者

数据范围

题解

本题可以使用双指针滑动窗口的思想来解决。我们用两个指针 分别表示当前窗口的左右边界,窗口内的宝石就是当前选择购买的宝石。我们维护窗口内宝石价格的总和 ,初始时

我们不断向右移动 指针,将宝石价格累加到 中,直到 超过预算 。此时,我们可以确定 范围内的宝石是可以购买的,更新答案为

接下来,我们需要缩小窗口的大小,即向右移动 指针,并从 中减去相应的宝石价格,直到 不超过预算 。然后继续向右移动 指针,重复上述过程。

如果在移动 指针的过程中,将 范围内的宝石都移除后 仍然超过预算 ,那么说明 指针指向的宝石价格太高,我们无法购买,此时可以直接将 都移动到 的位置,重新开始寻找。

最后,当 指针移动到数组末尾时,我们还需要再次判断 是否不超过预算 ,如果是,则更新答案。

时间复杂度为 ,空间复杂度为

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()
def max_gems(gems, value):
    left = 0
    window_sum = 0
    max_gems = 0

    for right in range(len(gems)):
        window_sum += gems[right]

        while window_sum > value:
            window_sum -= gems[left]
            left += 1

        max_gems = max(max_gems, right - left + 1)

    return max_gems

if __name__ == "__main__":
    n = int(input())
    gems = [int(input()) for _ in range(n)]
    v = int(input())

    print(max_gems(gems, v))
  • Java
import java.util.Scanner;

public class Main {
    public static int maxGems(int[] gems, int value) {
        int n = gems.length;
        int left = 0, right = 0, window_sum = 0, max_gems = 0;

        while (right < n) {
            window_sum += gems[right];

            while (window_sum > value) {
                window_sum -= gems[left];
                left++;
            }

            max_gems = Math.max(max_gems, right - left + 1);
            right++;
        }

        return max_gems;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] gems = new int[n];
        for (int i = 0; i < n; i++) {
            gems[i] = scanner.nextInt();
        }
        int v = scanner.nextInt();

        System.out.println(maxGems(gems, v));
    }
}
  • Cpp
#include <iostream>
#include <vector>
using namespace std;

int maxGems(vector<int>& gems, int value) {
    int n = gems.size();
    int left = 0, right = 0, window_sum = 0, max_gems = 0;

    while (right < n) {
        window_sum += gems[right];

        while (window_sum > value) {
            window_sum -= gems[left];
            left++;
        }

        max_gems = max(max_gems, right - left + 1);
        right++;
    }

    return max_gems;
}

int main() {
    int n, v;
    cin >> n;
    vector<int> gems(n);
    for (int i = 0; i < n; i++) {
        cin >> gems[i];
    }
    cin >> v;

    cout << maxGems(gems, v) << endl;
    return 0;
}
#华为##华为od##华为OD##华为OD机试算法题库##华为od题库#
最新华为OD机试-D卷 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD-C/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 提供OJ在线评测

全部评论
🌍 评测功能需要 订阅专栏 后联系清隆解锁~ #华为od#
点赞
送花
回复 分享
发布于 07-02 19:04 浙江

相关推荐

仅执行一次字符串交换能否使两个字符串相等题目描述给你长度相等的两个字符串&nbsp;s1&nbsp;和&nbsp;s2&nbsp;。一次&nbsp;字符串交换&nbsp;操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。如果对&nbsp;其中一个字符串&nbsp;执行&nbsp;最多一次字符串交换&nbsp;就可以使两个字符串相等,返回&nbsp;true&nbsp;;否则,返回&nbsp;false&nbsp;。示例&nbsp;1:输入:s1&nbsp;=&nbsp;&amp;quot;bank&amp;quot;,&nbsp;s2&nbsp;=&nbsp;&amp;quot;kanb&amp;quot;输出:true解释:例如,交换&nbsp;s2&nbsp;中的第一个和最后一个字符可以得到&nbsp;&amp;quot;bank&amp;quot;示例&nbsp;2:输入:s1&nbsp;=&nbsp;&amp;quot;attack&amp;quot;,&nbsp;s2&nbsp;=&nbsp;&amp;quot;defend&amp;quot;输出:false解释:一次字符串交换无法使两个字符串相等示例&nbsp;3:输入:s1&nbsp;=&nbsp;&amp;quot;kelb&amp;quot;,&nbsp;s2&nbsp;=&nbsp;&amp;quot;kelb&amp;quot;输出:true解释:两个字符串已经相等,所以不需要进行字符串交换示例&nbsp;4:输入:s1&nbsp;=&nbsp;&amp;quot;abcd&amp;quot;,&nbsp;s2&nbsp;=&nbsp;&amp;quot;dcba&amp;quot;输出:false提示:1&nbsp;&lt;=&nbsp;s1.length,&nbsp;s2.length&nbsp;&lt;=&nbsp;100s1.length&nbsp;==&nbsp;s2.lengths1&nbsp;和&nbsp;s2&nbsp;仅由小写英文字母组成答案评论区留下你的看法,欢迎讨论华为OD机试2024年D卷真题目录&nbsp;&nbsp;华为OD机试(D卷)2024真题目录(全、新、准)_牛客网 https://www.nowcoder.com/discuss/637324711520681984
查看1道真题和解析
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务