【华为OD机试2023】天然蓄水库 100% C++ Java Python

【华为OD机试2023】天然蓄水库 100% C++ Java Python

前言

如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!

本文解法非最优解(即非性能最优),不能保证通过率。

Tips1:机试为ACM 模式

你的代码需要处理输入输出,input/cin接收输入、print/cout 格式化输出

Tips2:机试按通过率算分

复杂题目可以考虑暴力破解,再逐步优化,不是运行超时就无法得分,比如一个分数为200的题目,当前通过率为50%,那么最终分数就是200*50%=100分

题目

题目描述

公元2919年,人类终于发现了一颗宜居星球一—x星。

现想在x星一片连绵起伏的山脉问建一个天热蓄水库,如何选取水库边界,使蓄水量最大?

要求:

  • 山脉用正整数数组s表示,每个元素代表山脉的高度。
  • 选取山脉上两个点作为蓄水库的边界,则边界内的区域可以蓄水,蓄水量需排除山脉占用的空
  • •蓄水量的高度为两边界的最小值。
  • 如果出现多个满足条件的边界,应选取距离最近的一组边界。

输出边界下标(从0开始) 和最大蓄水量;如果无法蓄水,则返回0,此时不返回边界。

例如,当山脉为s=[3,1,2]时,则选取s[0]和s[2]作为水库边界,则蓄水量为1,此时输出:0 2:1

当山脉s=[3,2,1]时,不存在合理的边界,此时输出:0。

输入描述

一行正整数,用空格隔开,例如输入

输出描述

当存在合理的水库边界时,输出左边界、空格、石边界、英文冒号、蓄水量;例如

补充说明

示例

1 8 6 2 5 4 8 3 7

1 6:15

代码

mountains = list(map(int, input().split()))

min_mountain = min(mountains)
max_area = 0
max_left = 0
max_right = 0

for i in range(len(mountains) - 2):
    left = mountains[i]
    if left == min_mountain:
        continue

    for j in range(i + 2, len(mountains)):
        right = mountains[j]
        if right == min_mountain:
            continue

        height = min(left, right)
        area = 0
        for k in range(i + 1, j):
            area_one = height - mountains[k]
            if area_one > 0:
                area += area_one

        if area > max_area:
            max_area = area
            max_left = i
            max_right = j
        elif area == max_area and (max_right - max_left) > (j - i):
            max_left = i
            max_right = j

if max_area == 0:
    print("0")
else:
    print(str(max_left) + " " + str(max_right) + ":" + str(max_area))

# 1 8 6 2 5 4 8 3 7
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> mountains;
    int mountain;
    while (cin >> mountain) {
        mountains.push_back(mountain);
    }

    int min_mountain = *min_element(mountains.begin(), mountains.end());
    int max_area = 0;
    int max_left = 0;
    int max_right = 0;

    for (int i = 0; i < mountains.size() - 2; i++) {
        int left = mountains[i];
        if (left == min_mountain) {
            continue;
        }

        for (int j = i + 2; j < mountains.size(); j++) {
            int right = mountains[j];
            if (right == min_mountain) {
                continue;
            }

            int height = min(left, right);
            int area = 0;
            for (int k = i + 1; k < j; k++) {
                int area_one = height - mountains[k];
                if (area_one > 0) {
                    area += area_one;
                }
            }

            if (area > max_area) {
                max_area = area;
                max_left = i;
                max_right = j;
            }
            else if (area == max_area && (max_right - max_left) > (j - i)) {
                max_left = i;
                max_right = j;
            }
        }
    }

    if (max_area == 0) {
        cout << "0" << endl;
    }
    else {
        cout << max_left << " " << max_right << ":" << max_area << endl;
    }

    return 0;
}

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] input = scanner.nextLine().split(" ");
        int[] mountains = new int[input.length];
        for (int i = 0; i < input.length; i++) {
            mountains[i] = Integer.parseInt(input[i]);
        }

        int min_mountain = Arrays.stream(mountains).min().getAsInt();
        int max_area = 0;
        int max_left = 0;
        int max_right = 0;

        for (int i = 0; i < mountains.length - 2; i++) {
            int left = mountains[i];
            if (left == min_mountain) {
                continue;
            }

            for (int j = i + 2; j < mountains.length; j++) {
                int right = mountains[j];
                if (right == min_mountain) {
                    continue;
                }

                int height = Math.min(left, right);
                int area = 0;

                for (int k = i + 1; k < j; k++) {
                    int area_one = height - mountains[k];
                    if (area_one > 0) {
                        area += area_one;
                    }
                }

                if (area > max_area) {
                    max_area = area;
                    max_left = i;
                    max_right = j;
                } else if (area == max_area && (max_right - max_left) > (j - i)) {
                    max_left = i;
                    max_right = j;
                }
            }
        }

        if (max_area == 0) {
            System.out.println("0");
        } else {
            System.out.println(max_left + " " + max_right + ":" + max_area);
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abmcar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值