【万题详解】洛谷P1252 马拉松接力赛

2024-01-21 10:12

本文主要是介绍【万题详解】洛谷P1252 马拉松接力赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

因为博主已经考完期末考试了,所以一定会多多更新。

P1252 马拉松接力赛

某城市冬季举办环城 25km马拉松接力赛,每个代表队有 5人参加比赛,比赛要求每个的每名参赛选手只能跑一次,一次至少跑 1km 、最多只能跑 10km,而且每个选手所跑的公里数必须为整数,即接力的地方在整公里处。

刘老师作为学校代表队的教练,精心选择了 5 名长跑能手,进行了训练和测试,得到了这 55 名选手尽力连续跑 1km、2km、…、10km 的所用时间。现在他要进行一个合理的安排,让每个选手跑合适的公里数,使学校代表队跑完 25km 所用的时间最短。根据队员的情况,这个最短的时间是惟一的,但安排方案可能并不惟一。

根据测试情况及一般运动员的情况得知,连续跑 1km 要比连续跑2km 速度快,连续跑 2km 又要比连续跑 3km 速度快……也就是说连续跑的路程越长,速度越慢,当然也有特殊的,就是速度不会变慢,但是绝不可能变快。

输入格式

5行数据,分别是 1 到 5号队员的测试数据,每行的 10个整数,表示某一个运动员尽力连续跑 1km 、 2km、…10km 所用的时间。

输出格式

两行,第一行是最短的时间,第二行是五个数据,分别是1到5号队员各自连续跑的公里数。

输入输出样例

输入 #1

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

9905
6 5 5 4 5

解题思路

对于这道题,如果使用暴力的全排列来做的话,那么显然时间复杂度会妥妥的达到10^5,如果我们想要过掉所有的数据点的话,暴力排列就显得十分无力,所以我们要选择别的方法。

这道题的特点在于要求最小值,因此我们可以往贪心和dp上去想,这里介绍一种贪心算法:

由于每个人都需要跑,因此第一步肯定要将每一个人分配一公里,那么接下来该怎么办呢?

显然无论在什么状态下,我们都要找跑这一公里最快的人来跑,因此我们只要每一次找每个人跑下一公里所需的时间再进行比较,就可以找到所需时间最短的人,将其标记即可。

或许你会问:每个人只能上场一次,如果按照刚刚的思路不就使得每个人上场多次了吗?

其实这并不是问题,由于我们要找的是最短的时间,因此无论先跑还是后跑,最优方案的总时长不变,所以不会对结果造成影响。

关于无后效性,由于每一步只受之前的状态影响,所以显然没有后效性。

最后有一个注意事项:开的标记数组不能超过10,否则会导致二维数组越界

AC:

#include<bits/stdc++.h>
using namespace std;
int minx=2147483647,flag,ans;
int a[5][11],b[5][11],c[5];
int main(){c[0]=c[1]=c[2]=c[3]=c[4]=1;for(int i=0;i<5;i++){for(int j=1;j<11;j++){cin>>a[i][j];b[i][j]=a[i][j]-a[i][j-1];}}for(int i=0;i<20;i++){minx=2147483647;for(int j=0;j<5;j++){if(b[j][c[j]+1]<minx&&c[j]+1<=10){flag=j;minx=b[j][c[j]+1];}}c[flag]++;}for(int i=0;i<5;i++){ans+=a[i][c[i]];}printf("%d\n%d %d %d %d %d\n",ans,c[0],c[1],c[2],c[3],c[4]);return 0; 
}

这篇关于【万题详解】洛谷P1252 马拉松接力赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629187

相关文章

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑