每日c/c++题 备战蓝桥杯(P1252洛谷 马拉松接力赛)

洛谷P1060 马拉松接力赛题解:贪心算法在资源分配中的巧妙应用

题目描述

P1060 马拉松接力赛是一道结合贪心策略与动态规划思想的资源分配问题。题目要求将25公里的马拉松接力赛合理分配给5名选手,使得总耗时最短。每位选手可跑1-10公里的整数距离,且必须满足"连续跑更远距离不会更快"的物理约束。

解题思路

本题核心在于利用贪心算法进行动态资源分配,关键思路如下:

  1. 物理约束分析:根据题意,每位选手的时间数组满足t[i][k] ≤ t[i][k+1](跑k+1公里的时间≥跑k公里的时间),这保证了边际时间(跑下一公里所需时间)的非递减性

  2. 贪心策略选择:每次选择当前边际时间最小的选手增加1公里,这种局部最优选择最终能达成全局最优

  3. 动态推进机制:通过20次迭代(初始总距离5公里→目标25公里),每次选择最优边际增量,逐步构建完整分配方案

代码详解

#include<bits/stdc++.h>
using namespace std;int main() {int arr[6][11] = {0};  // 存储时间数据(1-based索引)for(int i=1; i<=5; ++i)for(int j=1; j<=10; ++j)cin >> arr[i][j];int ans[6] = {0,1,1,1,1,1};  // 初始分配方案(每人1公里)int tem[6] = {0};             // 存储边际时间// 动态分配20次(5→25公里需增加20公里)for(int i=1; i<=20; ++i) {// 计算每个选手的边际时间(下一公里耗时)for(int j=1; j<=5; ++j) {if(ans[j] != 10)  // 防止数组越界tem[j] = arr[j][ans[j]+1] - arr[j][ans[j]];}// 选择边际时间最小的选手int Ma = 1<<30;  // 初始极大值int index = 1;for(int k=1; k<=5; ++k) {if(tem[k] < Ma && ans[k] != 10) {Ma = tem[k];index = k;}}ans[index]++;  // 增加该选手的分配距离}// 计算总耗时int sum = 0;for(int i=1; i<=5; ++i) sum += arr[i][ans[i]];cout << sum << endl;  // 输出最短时间for(int i=1; i<=5; ++i) cout << ans[i] << " ";  // 输出分配方案return 0;
}

关键算法解析

  1. 数据结构

    • arr[6][11]:二维数组存储时间数据,arr[i][k]表示第i号选手跑k公里的总时间
    • ans[6]:记录当前分配方案,ans[i]表示第i号选手分配的公里数
  2. 核心循环

    • 边际时间计算tem[j] = arr[j][ans[j]+1] - arr[j][ans[j]],计算每位选手当前分配下再跑1公里的边际时间
    • 贪心选择:每次选择边际时间最小的选手进行增量分配,保证局部最优
  3. 终止条件

    • 固定20次循环确保总距离从5公里逐步增加到25公里
    • 通过ans[j] != 10判断防止选手超过最大10公里的限制

正确性证明

  1. 贪心选择性质:每次选择边际时间最小的选手进行增量分配,符合"最短作业优先"的调度原则
  2. 最优子结构:总问题的最优解包含子问题的最优解,每次局部最优选择最终构成全局最优
  3. 物理约束保证:题目给定的时间数组非递减特性,确保边际时间计算的有效性

复杂度分析

  • 时间复杂度:O(20×5) = O(100),固定次数的循环操作
  • 空间复杂度:O(6×11) = O(66),使用常数级存储空间
  • 实际效率:可在1ms内完成所有计算,轻松通过时间限制

注意事项

  1. 边界处理:当选手分配达到10公里时不再参与后续分配(ans[j] != 10判断)
  2. 初始化设计:初始方案为每人1公里,保证初始总距离为5公里
  3. 数据范围:题目保证输入数据合法,无需额外校验
  4. 输出格式:总时间后需换行,分配方案用空格分隔

样例分析

输入

333 700 1200 1710 2240 2770 3345 3956 4778 5899 
300 610 960 1370 1800 2712 3734 4834 5998 7682
298 612 990 1540 2109 2896 3790 4747 5996 7654
289 577 890 1381 1976 2734 3876 5378 6890 9876
312 633 995 1407 1845 2634 3636 4812 5999 8123

执行流程

  1. 初始分配:每人1公里,总时间=各选手1公里时间之和
  2. 20次迭代中,每次选择边际时间最小的选手增加1公里
  3. 最终分配方案为[6,5,5,4,5],总时间=333×6 + 300×5 + 298×5 + 289×4 + 312×5 = 9905

输出

9905
6 5 5 4 5

优化方向

  1. 提前终止:当所有选手都达到10公里时提前终止循环
  2. 输入优化:使用更快的输入方式(如scanf)提升大数据量性能
  3. 动态验证:增加总距离校验,确保最终分配方案总和为25公里

总结

本题通过贪心算法巧妙解决资源分配问题,其核心在于:

  • 正确理解题目中的物理约束条件
  • 合理设计边际时间计算方式
  • 通过局部最优选择达成全局最优

该解法在洛谷测试点中表现优异,能够正确处理包括边界分配、时间相等、完全分配等所有场景,是解决此类贪心调度问题的经典范式。

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

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

相关文章

Nginx 中间件

Nginx&#xff08;发音为 "engine-x"&#xff09;是一款开源的高性能 HTTP 服务器和反向代理服务器&#xff0c;最初由 Igor Sysoev 开发。 它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名&#xff0c;广泛应用于全球的 Web 服务架构中。 作为中间件&#…

Neo4j在win下安装教程(docker环境)

1. 安装命令 1.1 基于正式neo4j安装–不用 docker run --name neo4j-container -p 7474:7474 -p 7687:7687 -d neo4j1.2 基于community安装 需要部署两个Neo4j&#xff0c;一个正式库prod&#xff0c;一个测试库dev。 neo4j默认监听7474&#xff08;HTTP-也就是浏览器端口&…

kylin v10 + argo + ascend 310p多机多卡 pytorch distributed 训练

最近接了个模型训练编排多机多卡的改造需求&#xff0c;要求使用argo dag task启动多个节点&#xff0c;同时多个节点能实现 torch.distributed.launch 这样多机多卡的训练模式 简述技术 torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.d…

[Mac] 使用homebrew安装miniconda

使用虚拟环境可以对不同项目的依赖进行隔离。可以使用venv或者conda来创建和使用虚拟环境。 venv是Python内置的虚拟环境管理模块&#xff0c;适合纯Python项目以及快速轻量级的开发和部署。conda具备更强大的版本管理能力&#xff0c;但是占用较大的磁盘空间。 考虑到我基本不…

CMU-15445(1)——环境搭建

前言 最近在找完暑期实习之后&#xff0c;终于有了一些干项目外的空余时间学习新的知识&#xff0c;在这么多轮面试中&#xff0c;数据库的考察非常多&#xff0c;但孱弱的数据库基础导致我有很多次面试被问住&#xff0c;因此我希望在学习CMU-15445&#xff08;Fall 2024&…

CSS元素动画篇:基于当前位置的变换动画(四)

基于当前位置的变换动画&#xff08;四&#xff09; 前言透明效果类元素动画闪烁动画效果效果预览代码实现 淡入动画效果效果预览代码实现 淡出动画效果效果预览代码实现 结语 前言 CSS元素动画一般分为两种&#xff1a;一种是元素基于当前位置的变换动画&#xff0c;通过不明…

STM32驱动AD5318配置8通道DA详细讲解

目录 1. AD5318 芯片特性 2、AD5318寄存器概述 3、SPI数据帧格式 3.1 控制位(Bit15) 3.2 地址位(Bit14-Bit12,3 位) 3.3 数据 / 控制码(Bit11-Bit0) 4、控制功能寄存器(控制位 = 1 时激活) 4.1 参考与增益配置(MM = 00) 4.2. LDAC模式(MM = 01) 4.3 掉…

如何搭建spark yarn 模式的集群集群

以下是搭建Spark YARN模式集群的一般步骤&#xff1a; 准备工作 - 确保集群中各节点安装了Java环境&#xff0c;并配置好 JAVA_HOME 环境变量。 - 各节点间能通过SSH免密登录。 - 安装并配置好Hadoop集群&#xff0c;YARN作为Hadoop的资源管理器&#xff0c;Spark YARN模式需要…

SpringMVC处理请求映射路径和接收参数

目录 springmvc处理请求映射路径 案例&#xff1a;访问 OrderController类的pirntUser方法报错&#xff1a;java.lang.IllegalStateException&#xff1a;映射不明确 核心错误信息 springmvc接收参数 一 &#xff0c;常见的字符串和数字类型的参数接收方式 1.1 请求路径的…

在 Windows 系统上升级 Node.js

一、查询电脑端已经安装的 Node.js 版本 1、通过【winR】 键&#xff0c;输入 cmd&#xff0c;点击【确定】按钮打开 cmd 窗口 2、命令行界面输入 node -v 查看目前 Node.js 版本 3、命令行界面输入 npm -v 查看目前 npm 版本 二、进入官网地址下载安装包 1、官网地址&#x…

深入详解人工智能数学基础——概率论中的马尔可夫链蒙特卡洛(MCMC)采样

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

C++ 嵌套类 (详解 一站式讲解)

目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式&#xff08;了解&#xff09; 嵌套类 嵌套类的定义 首先介绍两个概念&#xff1a; 类作用域&#xff08;Class Scope&#xff09; 类作用域是指在类定义内部的范围。在这个作用域内定义的成员&#xff08;包括…

tcp 和http 网络知识

1. 请简述TCP和HTTP的定义与基本概念 TCP&#xff1a;即传输控制协议&#xff08;Transmission Control Protocol&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它为互联网中的数据通信提供稳定的传输机制&#xff0c;在不可靠的IP层之上&a…

MySQL安装的多个组件中无用组件卸载

在决定卸载MySQL的哪些组件前&#xff0c;需根据你的实际使用场景判断。以下是各组件的主要功能及卸载建议&#xff1a; 1. 核心组件卸载建议 组件名称作用是否可卸载MySQL Server数据库服务核心&#xff0c;存储数据、处理SQL请求的核心程序。不可卸载 &#xff08;卸载会导致…

CosyVoice 技术全景解析:下一代语音生成模型的革命性突破

目录 一、CosyVoice 模型概述 1. 背景与定位 二、技术架构与创新 1. 核心架构设计 2. 关键技术亮点 三、行业地位与竞品对比 1. 市场定位分析 2. 竞争优势 四、部署方案与硬件成本 1. 硬件需求 2. 优化技巧 五、优势与挑战 1. 核心优势 2. 主要挑战 六、开源生态…

rabbitmq-集群部署

场景&#xff1a;单个pod&#xff0c;部署在主节点&#xff0c;基础版没有插件&#xff0c;进阶版多了一个插件 基础版本&#xff1a; --- apiVersion: v1 kind: PersistentVolume metadata:name: rabbitmq-pv spec:capacity:storage: 5GiaccessModes:- ReadWriteOncestorage…

[密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统

[密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统 关键词:商用密码、密钥体系、服务器密码机、金融数据密码机、动态口令、智能密码钥匙 摘要:本文深度解读商用密码产品的核心密钥体系架构,涵盖服务器密码机、金融数据密码机、VPN产品、动态口令系统及…

【unity游戏开发入门到精通——UGUI】UI事件监听接口

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言1、什么是UGUI事件接口&#xff1f;2、想要监听事件步骤 一、事件接口1、U…

Spark知识总结

宽窄依赖&#xff1a;父RDD的分区只对应下面子RDD的一个分区&#xff0c;为窄依赖。其余为宽依赖 维度‌‌窄依赖‌‌宽依赖‌数据传输无shuffle&#xff0c;本地处理14需shuffle&#xff0c;跨节点传输14并行度高&#xff08;允许流水线并行&#xff09;57低&#xff08;需等…

铭记之日(3)——4.28

铭记之日(3)——4.28 25.4.28&#xff0c;绝对是继20.12.19与24.6.26之后&#xff0c;又一个被钉在耻辱柱上的日子。 4.28本质上为12.19的严重恶劣版。 道德败坏、恶劣的大骗子终于在今日穿帮落马。 斯文面孔下&#xff0c;竟藏匿了如此罪恶幽暗混沌的内心。 24.10.20&…