贪吃的猴子 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香蕉,每次都只能从行的开头或者末尾获取,并且只能获取N次,求猴子最多能获取多少根香蕉。

输入描述

第一行为数组numbers的长度

第二行为数组numbers的值每个数字通过空格分开

第三行输入为N,表示获取的次数

输出描述

按照题目要求能获取的最大数值

示例1

输入
7
1 2 2 7 3 6 1
3

输出
10

示例2

输入
3
1 2 3
3

输出
6

说明
全部获取所有的香蕉,因此最终根数为1+2+3 = 6

示例3

输入
4
4 2 2 3
2

输出
7

说明
第一次获取香蕉为行的开头,第二次获取为行的末尾,因此最终根数为4+3 =7

备注

1<= numbers.length <= 100000

1<= numbers <= 100

1 <= N <= numbers.length

题解

这是一道数组和双指针的题目,需要通过双指针的方式在数组中找到最优解。

解题思路:

双指针的思路是通过两个指针(在这里是 lr)从两端向中间移动,通过不断的调整两边的元素选取个数,找到最佳结果。在这个问题中,通过调整左右两边的选取次数,计算获取香蕉的总数。

C++

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> numbers(n);
    for(int i=0; i<n; i++) cin >> numbers[i];

    int N;
    cin >> N;
    int tot = 0;
    for(int i=0; i<N; i++) tot += numbers[i];

    int rs = tot;

    int l = N-1, r = n-1;
    while(l >= 0) {
        tot += numbers[r--] - numbers[l--];
        rs = max(rs, tot);
    }

    cout << rs << endl;

    return 0;
}

Java

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] numbers = Arrays.stream(new int[n]).map(i -> in.nextInt()).toArray();
        int N = in.nextInt();

        // 左边选N个, 右侧选0个
        int tot = Arrays.stream(numbers, 0, N).sum();

        int rs = tot;
        int l = N - 1, r = n - 1;

        // 不断的尝试调整两边的元素选取个数, 找到最佳结果
        while (l >= 0) {
            tot += numbers[r--] - numbers[l--];
            rs = Math.max(rs, tot);
        }
        System.out.println(rs);
    }
}

Python

n = int(input())
numbers = list(map(int, input().split()))
N = int(input())

tot = sum(numbers[i] for i in range(N))
rs = tot

r = n - 1
for l in range(N-1, -1, -1):
    tot += numbers[r] - numbers[l]
    rs = max(rs, tot)
    r -= 1

print(rs)

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

#校招##秋招##华为##java##面经#
全部评论
回溯问题,要么取队首要么取队尾 public class Z8 { public static int solution(int[] arr, int n, int i, int max, boolean[] visit) { if (i == n) { return max; } // 取队首元素 int start = 0; for (int j = 0; j < arr.length; j++) { if (!visit[j]) { start = j; } } visit[start] = true; int max1 = solution(arr, n, i +1, max + arr[start], visit); visit[start] = false; // 取队尾元素 int end = arr.length - 1; for (int j = arr.length - 1; j >= 0; j--) { if (!visit[j]) { end = j ; } } visit[end] = true; int max2 = solution(arr, n, i +1, max + arr[end], visit); visit[end] = false; return Math.max(max1, max2); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int[] arr = new int[m]; for (int i = 0; i < m; i++) { arr[i] = sc.nextInt(); } int n = sc.nextInt(); boolean[] visit = new boolean[m]; System.out.println(solution(arr, n, 0, 0, visit)); } }
1 回复 分享
发布于 2024-04-19 18:13 浙江
可能我题目看错了,这个可不可以这样想,先设置一个比大小的函数(qsort我老搞不明白),再设置一个二维数组,循环,比较首尾大小,设置锚点s数组,选择哪个赋值,将没赋值的数写入二维数组的下一行,循环,结束把所有s赋值了的相加即可。
点赞 回复 分享
发布于 04-26 11:00 天津
限制取队首或队尾的数量, 并让总值最大, 那么可以转化为取特定长度的一段连续数字, 并让总值最小
点赞 回复 分享
发布于 03-20 11:20 北京
python解法有误
点赞 回复 分享
发布于 2024-02-05 15:07 江苏
原题+1
点赞 回复 分享
发布于 2023-12-27 17:15 湖北
有更好的解法,欢迎评论区留下, 大家有笔试真题欢迎投稿,祝大家
点赞 回复 分享
发布于 2023-12-26 11:47 湖北

相关推荐

ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
04-17 18:32
门头沟学院 Java
野猪不是猪🐗:他跟你一个学校,你要是进来之后待遇比他好,他受得了?
点赞 评论 收藏
分享
评论
4
4
分享

创作者周榜

更多
牛客网
牛客企业服务