[蓝桥杯]采油

news2025/6/7 23:50:41

采油

题目描述

LQ 公司是世界著名的石油公司,为世界供应优质石油。

最近,LQ 公司又在森林里发现了一大片区域的油田,可以在这个油田中开采 nn 个油井。

LQ 公司在这 nn 个油井之间修建了 n−1n−1 条道路,每条道路连接两个油井,路径中间不会路过任何油井,而且这些道路将所有油井连通。

建立油井的时候需要使用一台大型设备,运输起来非常麻烦,LQ 公司准备在其中的一个油井位置建立一个空运站,先将设备空运到空运站,之后每次经过他们建立的道路来运输这个大型设备以建立不同的油井,当油井建立完毕后再从空运站将大型设备运走。

为了减少运输的麻烦,公司要求大型设备在道路上运输的总路程是最短的。

在建立油井和采油的过程中需要花费一些人力,第 ii 个油井需要花费 BiBi​ 个人,而一旦油井建成,就需要 SiSi​个人一直坚守在油井上进行维护。

当然,如果一个人参与了油井的建设,他可以直接留下来维护油井,或者参与下一个油井的建设,但是在维护油井的人不能再参加后续油井的建设了。

现在 LQ 公司想知道,大型设备运输的总路径长度最短是多少?在保证总路径长度最短的情况下,LQ 公司至少需要花费多少人力才能完成所有油井的建立与维护。

输入描述

输入的第一行包含一个整数 nn ,表示油井的数量。油井由 1 到 nn 依次标号。

第二行包含 nn 个整数,依次表示 B1,B2,...,BnB1​,B2​,...,Bn​,相邻的整数之间用一个空格分隔。

第三行包含 nn 个整数,依次表示 S1,S2,...,SnS1​,S2​,...,Sn​,相邻的整数之间用一个空格分隔。

接下来 n−1n−1 行描述油井之间的道路,其中的第 ii 行包含两个整数 a,ba,b,用一个空格分隔,表示一条道路的起点为 i+1i+1、终点为 aa,长度为 bb,道路是双向的,设备可以从任意一端运送到另一端,每条道路都可以经过任意多次。数据保证任意两个油井之间都可以通过道路连接。

其中,nn 不超过 105105,B、S、cB、S、c 均为不超过 104104 的正整数。

输出描述

输出包含两个整数,用一个空格分隔,表示最优情况下大型设备需要运输的总路程,以及在总路程最短的情况下最少需要花费的人力数量。

输入输出样例

示例

输入

2
10 20
15 15
1 8

输出

16 30

样例说明

有两种方案达到最优。

方案一:在油井 2 建立空运站,先建立油井 2,再将大型设备运输到油井 1 建立油井 1,最后将大型设备运回油井 2。

方案二:在油井 1 建立空运站,先将大型设备运输到油井 2 建立油井 2 ,再将大型设备运送到油井 1 建立油井 1 。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

总通过次数: 36  |  总提交次数: 65  |  通过率: 55.4%

难度: 困难   标签: 2018, 规律, 思维, 国赛

算法思路

本题需要解决两个关键问题:

  1. ​设备运输总路径​​:在树形油田结构中,设备运输总路径恒等于​​所有边权之和的两倍​​(因为每条边需要往返一次)
  2. ​最少人力花费​​:完成所有油井的建立与维护所需的最小人力为​​所有油井维护人力之和​​(即 ΣS_i),因为维护人员需要长期驻守,而建设人员是临时调配的

算法步骤

  1. ​计算总路径长度​​:

    • 读取所有道路长度
    • 路径总和 = 所有边权之和 × 2
  2. ​计算最少人力​​:

    • 读取所有油井的维护人力 S_i
    • 人力总和 = ΣS_i

C++代码实现:

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    // 读取油井数量
    int n;
    cin >> n;
    
    // 跳过建设人力B_i(不影响结果)
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
    }
    
    // 计算维护人力总和
    long long total_people = 0;
    for (int i = 0; i < n; i++) {
        int s;
        cin >> s;
        total_people += s;
    }
    
    // 计算道路总长度
    long long total_path = 0;
    for (int i = 0; i < n - 1; i++) {
        int a, b;
        cin >> a >> b; // a可忽略
        total_path += b;
    }
    total_path *= 2; // 往返路径
    
    // 输出结果
    cout << total_path << " " << total_people;
    return 0;
}

代码解析

  1. ​输入处理​​:

    • n:油井数量
    • 跳过B_i:建设人力不影响最终结果
    • 累加S_i:维护人力总和决定最终花费
  2. ​路径计算​​:

    • 每条道路长度累加后乘以2(往返路径)
    • 使用long long防止溢出(最大路径 2e9)
  3. ​输出格式​​:

    • 先输出设备总路径
    • 再输出维护人力总和

实例验证

​输入样例​​:

2
10 20
15 15
1 8

​计算过程​​:

  • 路径总和:8 × 2 = 16
  • 维护人力:15 + 15 = 30
  • ​输出​​:16 30

注意事项

  1. ​数据范围​​:

    • n ≤ 10^5:需用long long存储路径总和
    • 边权 ≤ 10^4:最大路径 2×10^5×10^4 = 2×10^9
  2. ​输入顺序​​:

    • 第二行(建设人力)可完全忽略
    • 道路信息只需读取边权(起点编号无用)
  3. ​时间复杂度​​:

    • O(n) 线性复杂度
    • 1秒可处理最大规模数据

测试点设计

​测试类型​输入样例预期输出验证点
最小规模n=1, B=[5], S=[3], 无边0 3单节点处理
边界值n=10^5, 所有边权=10^42e9 ΣS_i大数据溢出防护
维护人力不均n=3, S=[100,200,300]路径 600人力累加正确性
道路权重差异n=3, 边权=[1,1000]2002 ΣS路径计算正确性

优化建议

  1. ​I/O优化​​:

    ios::sync_with_stdio(false);
    cin.tie(0);

    禁用C与C++流同步,提升输入输出效率

  2. ​内存优化​​:

    • 不存储B数组,边权实时累加
    • 峰值内存仅需几KB
  3. ​算法扩展​​:

    • 若题目要求建设人力优化,需用树形DP:
    # 伪代码:树形DP求最小人力峰值
    def dfs(u, parent):
        dp[u] = S[u]  # 维护人力
        children = []
        for v in tree[u]:
            if v == parent: continue
            dfs(v, u)
            children.append((B[v]-S[v], dp[v]))
        # 贪心排序:净释放大的优先
        sort(children by B_v-S_v descending)
        
        current = 0  # 当前可用人力
        for (net_release, sub_dp) in children:
            if current < B[v]:
                dp[u] += B[v] - current  # 补充人力
                current = 0
            else:
                current -= B[v]
            current += net_release
            dp[u] += sub_dp - S[v]  # 累加子树需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑龙江云前沿服务器租用:便捷高效的灵活之选​

服务器租用&#xff0c;即企业直接从互联网数据中心&#xff08;IDC&#xff09;提供商处租赁服务器。企业只需按照所选的服务器配置和租赁期限&#xff0c;定期支付租金&#xff0c;即可使用服务器开展业务。​ 便捷快速部署&#xff1a;租用服务器能极大地缩短服务器搭建周期…

论文解读:Locating and Editing Factual Associations in GPT(ROME)

论文发表于人工智能顶会NeurIPS(原文链接)&#xff0c;研究了GPT(Generative Pre-trained Transformer)中事实关联的存储和回忆&#xff0c;发现这些关联与局部化、可直接编辑的计算相对应。因此&#xff1a; 1、开发了一种因果干预方法&#xff0c;用于识别对模型的事实预测起…

学习设计模式《十二》——命令模式

一、基础概念 命令模式的本质是【封装请求】命令模式的关键是把请求封装成为命令对象&#xff0c;然后就可以对这个命令对象进行一系列的处理&#xff08;如&#xff1a;参数化配置、可撤销操作、宏命令、队列请求、日志请求等&#xff09;。 命令模式的定义&#xff1a;将一个…

十三、【核心功能篇】测试计划管理:组织和编排测试用例

【核心功能篇】测试计划管理&#xff1a;组织和编排测试用例 前言准备工作第一部分&#xff1a;后端实现 (Django)1. 定义 TestPlan 模型2. 生成并应用数据库迁移3. 创建 TestPlanSerializer4. 创建 TestPlanViewSet5. 注册路由6. 注册到 Django Admin 第二部分&#xff1a;前端…

手撕 K-Means

1. K-means 的原理 K-means 是一种经典的无监督学习算法&#xff0c;用于将数据集划分为 kk 个簇&#xff08;cluster&#xff09;。其核心思想是通过迭代优化&#xff0c;将数据点分配到最近的簇中心&#xff0c;并更新簇中心&#xff0c;直到簇中心不再变化或达到最大迭代次…

SmolVLA: 让机器人更懂 “看听说做” 的轻量化解决方案

&#x1f9ed; TL;DR 今天&#xff0c;我们希望向大家介绍一个新的模型: SmolVLA&#xff0c;这是一个轻量级 (450M 参数) 的开源视觉 - 语言 - 动作 (VLA) 模型&#xff0c;专为机器人领域设计&#xff0c;并且可以在消费级硬件上运行。 SmolVLAhttps://hf.co/lerobot/smolvla…

day45python打卡

知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensorbo…

AIGC赋能前端开发

一、引言&#xff1a;AIGC对前端开发的影响 1. AIGC与前端开发的关系 从“写代码”到“生成代码”传统开发痛点&#xff1a;重复性编码工作、UI 设计稿还原、问题定位与调试...核心场景的AI化&#xff1a;需求转代码&#xff08;P2C&#xff09;、设计稿转代码&#xff08;D2…

Web 3D协作平台开发案例:构建制造业远程设计与可视化协作

HOOPS Communicator为开发者提供了丰富的定制化能力&#xff0c;助力他们在实现强大 Web 3D 可视化功能的同时&#xff0c;灵活构建符合特定业务需求的工程应用。对于希望构建在线协同设计工具的企业而言&#xff0c;如何在保障性能与用户体验的前提下实现高效开发&#xff0c;…

AI Agent开发第78课-大模型结合Flink构建政务类长公文、长文件、OA应用Agent

开篇 AI Agent2025确定是进入了爆发期,到处都在冒出各种各样的实用AI Agent。很多人、组织都投身于开发AI Agent。 但是从3月份开始业界开始出现了一种这样的声音: AI开发入门并不难,一旦开发完后没法用! 经历过至少一个AI Agent从开发到上线的小伙伴们其实都听到过这种…

第三方测试机构进行科技成果鉴定测试有什么价值

在当今科技创新的浪潮中&#xff0c;科技成果的鉴定测试至关重要&#xff0c;而第三方测试机构凭借其独特优势&#xff0c;在这一领域发挥着不可替代的作用。那么&#xff0c;第三方测试机构进行科技成果鉴定测试究竟有什么价值呢&#xff1f; 一、第三方测试机构能提供独立、公…

华为云Flexus+DeepSeek征文|基于华为云Flexus X和DeepSeek-R1打造个人知识库问答系统

目录 前言 1 快速部署&#xff1a;一键搭建Dify平台 1.1 部署流程详解 1.2 初始配置与登录 2 构建专属知识库 2.1 进入知识库模块并创建新库 2.2 选择数据源导入内容 2.3 上传并识别多种文档格式 2.4 文本处理与索引构建 2.5 保存并完成知识库创建 3接入ModelArts S…

【数据结构】_排序

【本节目标】 排序的概念及其运用常见排序算法的实现排序算法复杂度及稳定性分析 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 1.2特性…

PPT转图片拼贴工具 v4.3

软件介绍 这个软件就是将PPT文件转换为图片并且拼接起来。 效果展示 支持导入文件和支持导入文件夹&#xff0c;也支持手动输入文件/文件夹路径 软件界面 这一次提供了源码和开箱即用版本&#xff0c;exe就是直接用就可以了。 软件源码 import os import re import sys …

Chrome安装代理插件ZeroOmega(保姆级别)

目录 本文直接讲解一下怎么本地安装ZeroOmega一、下载文件在GitHub直接下ZeroOmega 的文件&#xff08;下最新版即可&#xff09; 二、安装插件打开 Chrome 浏览器&#xff0c;访问 chrome://extensions/ 页面&#xff08;扩展程序管理页面&#xff09;&#xff0c;并打开开发者…

Transformer-BiGRU多变量时序预测(Matlab完整源码和数据)

Transformer-BiGRU多变量时序预测&#xff08;Matlab完整源码和数据&#xff09; 目录 Transformer-BiGRU多变量时序预测&#xff08;Matlab完整源码和数据&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-BiGRU多变量时间序列预测&…

新华三H3CNE网络工程师认证—Easy IP

Easy IP 就是“用路由器自己的公网IP&#xff0c;给全家所有设备当共享门牌号”的技术&#xff01;&#xff08;省掉额外公网IP&#xff0c;省钱又省配置&#xff01;&#xff09; 生活场景对比&#xff0c;想象你住在一个小区&#xff1a;普通动态NAT&#xff1a;物业申请了 …

Excel 模拟分析之单变量求解简单应用

正向求解 利用公式根据贷款总额、还款期限、贷款利率&#xff0c;求每月还款金额 反向求解 根据每月还款能力&#xff0c;求最大能承受贷款金额 参数&#xff1a; 目标单元格&#xff1a;求的值所在的单元格 目标值&#xff1a;想要达到的预期值 可变单元格&#xff1a;变…

装备制造项目管理具备什么特征?如何选择适配的项目管理软件系统进行项目管控?

国内某大型半导体装备制造企业与奥博思软件达成战略合作&#xff0c;全面引入奥博思 PowerProject 打造企业专属项目管理平台&#xff0c;进一步提升智能制造领域的项目管理效率与协同能力。 该项目管理平台聚焦半导体装备研发与制造的业务特性&#xff0c;实现了从项目立项、…

FPGA 动态重构配置流程

触发FPGA 进行配置的方式有两种&#xff0c;一种是断电后上电&#xff0c;另一种是在FPGA运行过程中&#xff0c;将PROGRAM 管脚拉低。将PROGRAM 管脚拉低500ns 以上就可以触发FPGA 进行重构。 FPGA 的配置过程大致可以分为&#xff1a;配置的触发和建立阶段、加载配置文件和建…