目录题目思路Code题目题目内容某能源集团管理 N 个区域编号为 0 到 N-1。每个区域有绿色能源减排量和化石能源碳排放量单位均为吨。区域间通过 M 条输电线路连接相连区域属于同一碳交易区。在同一碳交易区内绿色减排量可跨区域抵消碳排放量。区内总减排量 max(0, 绿色减排量总量 - 化石能源碳排放量总量) * 区内区域数。请输出所有碳交易区中减排量的最大值。若无有效碳交易区即没有输电线路或所有连通区域的区域数都小于 2则输出 -1。输入描述第一行输入整数数组 green逗号分隔长度为 N表示编号 0 到 N-1 的区域绿色能源减排量。第二行输入整数数组 carbon逗号分隔长度为 N表示编号 0 到 N-1 的区域化石能源碳排放量。第三行输入二维整数数组 edges边之间以空格分隔每条边形如 a,b表示区域 a 与区域 b 之间有输电线路。当 M 为 0 时第三行可能不存在或为空。约束1 N 100。0 M N * (N - 1) / 2。0 green[i] 10000。0 carbon[i] 10000。0 edges[i][0], edges[i][1] N - 1。edges[i][0] ! edges[i][1]且无重复边。输出描述输出一个整数表示所有碳交易区中减排量的最大值。若无有效碳交易区输出 -1。样例1输入5,8,3,104,2,6,90,1 2,3样例1输出14样例1说明区域 0 和 1 连通绿色减排总量为 13碳排放总量为 6减排量为 (13 - 6) * 2 14。区域 2 和 3 连通绿色减排总量为 13碳排放总量为 15减排量为 max(0, 13 - 15) * 2 0。最大减排量为 14。样例2输入3,5,76,4,20,1 1,2样例2输出9样例2说明3 个区域全连通为一个碳交易区绿色减排总量为 15碳排放总量为 12减排量为 (15 - 12) * 3 9。样例3输入2,4,62,4,6样例3输出-1样例3说明没有输电线路无有效碳交易区。思路并查集使用并查集合并所有输电线路两端的区域。遍历每个区域按连通块代表节点统计区域数、绿色能源减排总量和化石能源碳排放总量。对区域数至少为 2 的连通块计算减排量并取最大值。如果不存在这样的连通块则输出 -1。Codeimport sys def find(parent, x): # 路径压缩把连通块代表节点扁平化后续统计时根节点稳定且查询更快。 if parent[x] ! x: parent[x] find(parent, parent[x]) return parent[x] def union(parent, a, b): ra find(parent, a) rb find(parent, b) if ra ! rb: parent[rb] ra def parse_nums(line): return [int(x) for x in line.strip().split(,) if x ! ] def parse_edges(line): edges [] for item in line.strip().split(): a, b item.split(,) edges.append((int(a), int(b))) return edges def solve(green, carbon, edges): if not edges: return -1 n len(green) parent list(range(n)) # 每个区域先独立成块输电线路会把同一交易区合并起来。 for a, b in edges: union(parent, a, b) groups {} for i in range(n): # 按并查集根节点聚合区域数、绿色减排总量和碳排放总量。 root find(parent, i) if root not in groups: groups[root] [0, 0, 0] groups[root][0] 1 groups[root][1] green[i] groups[root][2] carbon[i] best -1 for count, green_sum, carbon_sum in groups.values(): # 只有至少两个区域组成的连通块才是有效碳交易区。 if count 2: best max(best, max(0, green_sum - carbon_sum) * count) return best def main(): lines sys.stdin.read().splitlines() if len(lines) 2: return green parse_nums(lines[0]) carbon parse_nums(lines[1]) edges parse_edges(lines[2]) if len(lines) 3 and lines[2].strip() else [] print(solve(green, carbon, edges)) if __name__ __main__: main()JSconst fs require(fs); const lines fs.readFileSync(0, utf8).split(/\r?\n/); function parseNums(line) { if (!line || line.trim() ) { return []; } return line.trim().split(,).map(Number); } function find(parent, x) { // 路径压缩把连通块代表节点扁平化统计时能快速归组。 if (parent[x] ! x) { parent[x] find(parent, parent[x]); } return parent[x]; } function unite(parent, a, b) { const ra find(parent, a); const rb find(parent, b); if (ra ! rb) { parent[rb] ra; } } function solve(green, carbon, edgeLine) { const fields edgeLine.trim() ? [] : edgeLine.trim().split(/\s/); if (fields.length 0) { return -1; } const parent Array.from({ length: green.length }, (_, i) i); // 每个区域先独立成块输电线路会把同一交易区合并起来。 for (const item of fields) { const [a, b] item.split(,).map(Number); unite(parent, a, b); } const groups new Map(); // 每个根节点对应 [区域数, 绿色减排总量, 碳排放总量]。 for (let i 0; i green.length; i) { const root find(parent, i); if (!groups.has(root)) { groups.set(root, [0, 0, 0]); } const value groups.get(root); value[0]; value[1] green[i]; value[2] carbon[i]; } let best -1; for (const value of groups.values()) { // 只有至少两个区域组成的连通块才是有效碳交易区。 if (value[0] 2) { best Math.max(best, Math.max(0, value[1] - value[2]) * value[0]); } } return best; } const green parseNums(lines[0] || ); const carbon parseNums(lines[1] || ); const edgeLine lines.length 3 ? lines[2] : ; console.log(solve(green, carbon, edgeLine));【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗?有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。