【万题详解】洛谷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

相关文章

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo