华为OD机试真题 新系统 2026-06-21 Python&JS 实现【预测新能源发电量】
目录
题目
某地面光伏电站按区域划分为多个子阵。每个子阵的发电能力有明确约束:
发电能力上限 max_capacity
发电能力下限 min_capacity
基准发电量 base_generation
系统需要根据这些约束预测整个电站的发电量。预测策略为:
第1点:每个子阵先使用基准发电量作为预测值。
第2点:如果所有子阵的基准发电量总和超过电站总容量上限,则需要按比例缩减。
第3点:如果所有子阵的基准发电量总和低于电站总容量下限,则需要按比例放大。
第4点:每个子阵调整后的预测发电量仍需限制在自身 [min_capacity, max_capacity] 范围内。
输入描述
输入一个二维数组 plants,每一行表示一个子阵:
[max_capacity, min_capacity, base_generation]
含义分别为该子阵的发电能力上限、发电能力下限、基准发电量。
输出描述
输出调整后的总预测发电量。
若总基准发电量位于全站总下限和总上限之间,直接输出总基准发电量。
若总基准发电量超过总上限,按比例缩减后分别限制到各子阵上下限,再输出调整后的总和。
若总基准发电量低于总下限,按比例放大后分别限制到各子阵上下限,再输出调整后的总和。
样例 1
输入:
[[100,20,80],[200,50,120],[150,30,100]]
输出:
300
说明:基准发电量总和为 80 + 120 + 100 = 300,总下限为 100,总上限为 450,位于合法范围内,直接输出 300。
样例 2
输入:
[[100,20,120],[200,50,240]]
输出:
300
说明:基准总量为 360,超过总上限 300,按 300 / 360 比例缩减,调整后为 100 和 200,输出 300。
样例 3
输入:
[[100,50,20],[80,30,20]]
输出:
80
说明:基准总量为 40,低于总下限 80,按 80 / 40 比例放大,调整后为 40 和 40,均在各自上下限内,输出 80。
思路
逻辑分析题。
先分别统计所有子阵的基准发电量总和、下限总和、上限总和。若基准总和已经处于总下限和总上限之间,直接返回基准总和。
若基准总和超过总上限,说明整体预测偏高,需要按 `总上限 / 基准总和` 的比例缩减每个子阵;若基准总和低于总下限,说明整体预测偏低,需要按 `总下限 / 基准总和` 的比例放大每个子阵。每个子阵调整后仍要限制在自己的 `[min_capacity, max_capacity]` 范围内。最后把所有调整后的子阵发电量求和并输出整数结果。
Code
import ast
def solve(arr):
# 总基准超出范围时,按目标总量与基准总量的比例统一调整。
total_max = sum(x[0] for x in arr)
total_min = sum(x[1] for x in arr)
total_base = sum(x[2] for x in arr)
if total_min <= total_base <= total_max:
return total_base
# 根据整体偏差决定统一缩放比例。
# 先累计总上限、总下限和总基准,用于判断是否需要整体缩放。
ratio = total_max / total_base if total_base > total_max else total_min / total_base
total = 0.0
for max_cap, min_cap, base in arr:
val = base * ratio
# 每个子阵仍受自己的上下限约束。
val = max(min_cap, min(max_cap, val))
total += val
return int(round(total))
# 输入是二维数组,每个子阵包含最大容量、最小容量和基准发电量。
data = ast.literal_eval(input().strip())
# 汇总所有子阵调整值并按整数形式输出。
print(solve(data))
JS
const fs = require("fs");
// 输入是二维数组,每个子阵包含最大容量、最小容量和基准发电量。
const input = fs.readFileSync(0, "utf8").trim();
const nums = (input.match(/-?\d+/g) || []).map(Number);
const n = Math.floor(nums.length / 3);
let totalMax = 0, totalMin = 0, totalBase = 0;
// 总基准超出范围时,按目标总量与基准总量的比例统一调整。
for (let i = 0; i < n; i++) {
totalMax += nums[3 * i];
totalMin += nums[3 * i + 1];
totalBase += nums[3 * i + 2];
}
if (totalBase >= totalMin && totalBase <= totalMax) {
// 汇总所有子阵调整值并按整数形式输出。
console.log(totalBase);
} else {
// 总量偏高则缩减,偏低则放大。
// 先累计总上限、总下限和总基准,用于判断是否需要整体缩放。
const ratio = totalBase > totalMax ? totalMax / totalBase : totalMin / totalBase;
// 每个子阵调整后还要被自身上下限截断,不能只看总量。
let ans = 0;
for (let i = 0; i < n; i++) {
let val = nums[3 * i + 2] * ratio;
// 单个子阵仍需满足自身上下限。
val = Math.max(nums[3 * i + 1], Math.min(nums[3 * i], val));
ans += val;
}
console.log(Math.round(ans));
}
【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集
【华为od机试真题Python】:Python真题题库
【华为od机试真题JavaScript】:JavaScript真题题库
【华为od机试真题Java&Go】:Java&Go真题题库
【华为od机试真题C++】:C++真题题库
【华为od机试真题C语言】:C语言真题题库
【华为od面试手撕代码题库】:面试手撕代码题库
【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】
华为OD机试:二本院校有机会吗?
有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。
更多推荐





所有评论(0)