CSP-J 2023 复赛第4题:旅游巴士
【题目来源】
https://www.luogu.com.cn/problem/P9751
https://www.acwing.com/problem/content/description/5313/
【题目描述】
小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。
旅游景点的地图共有 n 处地点,在这些地点之间连有 m 条道路。
其中 1 号地点为景区入口,n 号地点为景区出口。
我们把一天当中景区开门营业的时间记为 0 时刻,则从 0 时刻起,每间隔 k 单位时间便有一辆旅游巴士到达景区入口,同时有一辆旅游巴士从景区出口驶离景区。
所有道路均只能单向通行。
对于每条道路,游客步行通过的用时均为恰好 1 单位时间。
小 Z 希望乘坐旅游巴士到达景区入口,并沿着自己选择的任意路径走到景区出口,再乘坐旅游巴士离开,这意味着他到达和离开景区的时间都必须是 k 的非负整数倍。
由于节假日客流众多,小 Z 在坐旅游巴士离开景区前只想一直沿着景区道路移动,而不想在任何地点(包括景区入口和出口)或者道路上停留。
出发前,小 Z 忽然得知:景区采取了限制客流的方法,对于每条道路均设置了一个“开放时间” ai,游客只有不早于 ai 时刻才能通过这条道路。
请帮助小 Z 设计一个旅游方案,使得他乘坐旅游巴士离开景区的时间尽量地早。
【输入格式】
输入的第一行包含 3 个正整数 n,m,k,表示旅游景点的地点数、道路数,以及旅游巴士的发车间隔。
输入的接下来 m 行,每行包含 3 个非负整数 ui,vi,ai,表示第 i 条道路从地点 ui 出发,到达地点 vi,道路的“开放时间”为 ai。
【输出格式】
输出一行,仅包含一个整数,表示小 Z 最早乘坐旅游巴士离开景区的时刻。
如果不存在符合要求的旅游方案,输出 -1。
【数据范围】
对于所有测试数据有:2≤n≤10^4,1≤m≤2×10^4,1≤k≤100,1≤ui,vi≤n,0≤ai≤10^6。
【输入样例】
5 5 3
1 2 0
2 5 1
1 3 0
3 4 3
4 5 1
【输出样例】
6
【样例解释】
小 Z 可以在 3 时刻到达景区入口,沿 1→3→4→5 的顺序走到景区出口,并在 6 时刻离开。
【算法分析】
本题需要用到的知识点:
○ priority_queue元素为结构体时需重载 operator<
STL priority_queue 具有“自动排序”的强大功能。其默认使用 operator< 的比较方式进行排序。
但是,对于自定义类型(如结构体、联合体、枚举等),则必须重载 operator< 比较方式。
详见:https://blog.csdn.net/hnjzsyjyj/article/details/124521165
例如,以下两段代码等价。
struct Node {int pr,index;
};
bool operator<(Node a,Node b) {return a.pr>b.pr;
}
struct Node {int pr,index;bool operator<(const Node &b) const {return pr>b.pr;}
};
○ 按结构体某一字段对结构体数组进行排序(C++) https://blog.csdn.net/hnjzsyjyj/article/details/120184972
【算法代码】
#include <bits/stdc++.h>
using namespace std;const int inf=0x3f3f3f3f;
const int maxk=105;
const int maxn=10005;
vector<pair<int, int>> G[maxn];
int dis[maxn][maxk];
bool vis[maxn][maxk];
int n,m,k;struct Node {int x,y,d;bool operator<(const Node &W) const {return d>W.d;}
};void dijkstra() {priority_queue<Node> Q;memset(dis,inf,sizeof(dis));Q.push({1,0,dis[1][0]=0});while(Q.size()) {int x=Q.top().x;int y=Q.top().y;Q.pop();if(vis[x][y]) continue;vis[x][y]=1;for(int i=0; i<G[x].size(); i++) {int v=G[x][i].first;int w=G[x][i].second;int t=dis[x][y];int j=(y+1)%k;if(t<w) t+=(w-t+k-1)/k*k;if(dis[v][j]>t+1) Q.push({v,j,dis[v][j]=t+1});}}
}int main() {cin>>n>>m>>k; //scanf("%d%d%d",&n,&m,&k);while(m--) {int u,v,w;cin>>u>>v>>w; //scanf("%d%d%d",&u,&v,&w);G[u].push_back(make_pair(v,w));}dijkstra();if(dis[n][0]==inf) dis[n][0]=-1;cout<<dis[n][0]<<endl; //printf("%d\n",dis[n][0]);return 0;
}/*
in:
5 5 3
1 2 0
2 5 1
1 3 0
3 4 3
4 5 1out:
6
*/
【参考文献】
https://mp.weixin.qq.com/s/zckJsihxsDT2JNBFK1ipxA
https://www.acwing.com/problem/content/solution/5313/1/
https://www.luogu.com.cn/problem/solution/P9751
https://www.acwing.com/solution/content/214064/
相关文章:
CSP-J 2023 复赛第4题:旅游巴士
【题目来源】https://www.luogu.com.cn/problem/P9751https://www.acwing.com/problem/content/description/5313/【题目描述】 小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。 旅游景点的地图共有 n 处地点,在这些地点之间连有 m 条道路。 其中…...
JAVA算法和数据结构
一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的,Arrays是操作数组的工具类,它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下:遍历、拷贝、排序等操作。需要用到的方法如下 public…...
每日五道java面试题之spring篇(七)
目录: 第一题. 什么是Spring beans?第二题. 一个 Spring Bean 定义 包含什么?第三题. 如何给Spring 容器提供配置元数据?Spring有几种配置方式?第四题. Spring基于xml注入bean的几种方式?第五题:你怎样定义类的作用域…...
Keil编译GD32工程时找不到lib库文件
D:\Keil5\ARM\ARMCLANG\Bin\..\lib\armlib\mc_p.l:SELECTION_SCRIPT(2974): error: L6907E: Expected an expression. 问题 解决方法:因为编译器没有找到那个函数的代码,也就未解析了 其实问题很简单,把你的lib文件加进去,ok了…...
测试C#使用ViewFaceCore实现图片中的人脸遮挡
基于ViewFaceCore和DlibDotNet都能实现人脸识别,准备做个遮挡图片中人脸的程序,由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系,最终决定使用ViewFaceCore实现图片中的人脸遮挡。 新建Winform项目,在Nuget包管理器中…...
2.21 Qt day2 菜单栏/工具栏/状态栏/浮动窗口、UI界面、信号与槽
思维导图 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",…...
300分钟吃透分布式缓存-16讲:常用的缓存组件Redis是如何运行的?
Redis 基本原理 Redis 简介 Redis 是一款基于 ANSI C 语言编写的,BSD 许可的,日志型 key-value 存储组件,它的所有数据结构都存在内存中,可以用作缓存、数据库和消息中间件。 Redis 是 Remote dictionary server 即远程字典服务…...
上一篇文章补充:已经存在的小文件合并
对于HDFS上已经存在的大量小文件问题,有多种策略可以进行处理和优化: 1. **合并小文件**: - **使用Spark作业合并**:通过编写Spark程序读取小文件并调用repartition()或coalesce()函数重新分区数据,然后将合并后的…...
代码随想录训练营第三十期|第四十三天|动态规划 part05|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
1049. 最后一块石头的重量 II - 力扣(LeetCode) class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for (int n : stones) {sum n;}int target sum / 2;int[] dp new int[target 1];for (int i 0; i < stones.length; i…...
c++学习记录 string容器—字符串插入和删除
函数原型: string& insert(int pos,const char* s); //插入字符串string& insert(int pos,const string& str); //插入字符串string& insert(int pos,int n,char c); //在指定位置插入n个字符cstring&…...
【IEEE会议征稿】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)
2024年第九届智能计算与信号处理国际学术会议(ICSP 2024) 2024年第八届智能计算与信号处理国际学术会议(ICSP 2024)将在西安举行, 会期是2024年4月19-21日, 为期三天, 会议由西安科技大学主办。 欢迎参会&…...
【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制
【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制 文章目录 前言一、脉振高频电压注入法简介(注入在旋转坐标系的d轴)1.旋转高频电压(电流)注入法2.脉振高频电压注入法 二、高频注入理论1.永磁同步电机的高频模型2…...
Java学习——集合框架
Java集合框架(Java Collections Framework)是一套性能优良、使用方便的接口和类的集合,它位于java.util包下。这个框架包含了一系列集合接口的标准实现,比如列表、集合、队列,以及映射。使用这些集合,你可以…...
【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期
一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页…...
jdk动态代理与CGLib动态代理
jdk动态代理 目标对象 package com.study;/*** 目标对象(被代理的对象)**/ public class Target implements TargetInf{public String name;public Target() {}public Target(String name) {this.name name;}public String buyCola (String name){Sys…...
Linux 命令行的世界 :4.操作文件和目录
此时此刻,我们已经准备好了做些真正的工作!这一章节将会介绍以下命令: • cp —复制文件和目录 • mv —移动/重命名文件和目录 • mkdir —创建目录 • rm —删除文件和目录 • ln —创建硬链接和符号链接 图形文件管理器能轻松地实现…...
如何使用ArcGIS Pro生成等高线
无论在制图还是规划中,经常会使用到等高线,大多数情况下,从网上获取的高程数据都是DEM文件,我们可以通过ArcGIS Pro来生成等高线,这里为大家介绍一下生成方法,希望能对你有所帮助。 数据来源 教程所使用的…...
golang学习2,golang开发配置国内镜像
go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct...
Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)
上篇文章介绍了openpose,本篇文章介绍下线稿约束,关于线稿约束有好几个处理器都属于此类型,但是有一些区别。 包含: 1、Canny(硬边缘):识别线条比较多比较细,一般用于更大程度得还原照片 2、ML…...
前端笔记——var let const 之间的区别
Var: 关键字来声明变量。它有以下特点: var声明的变量作用域是函数级的,即在函数内部声明的变量在整个函数范围内可见。 var变量可以被重复声明,而不会引发错误。 var变量会存在变量提升(hoisting)现象&…...
AI小白必看:手把手教你开发大模型智能体,附收藏指南!
本文深入解析AI Agent(智能体)的核心概念与技术架构,通过实战案例展示如何使用LangChain等工具开发智能客服Agent。文章涵盖自主任务拆解、工具调用、多轮交互等关键点,并分享避免“模型幻觉”的实践技巧及性能优化方法。适合程序…...
qmcdump:3步轻松解锁QQ音乐加密文件,实现跨设备音乐自由
qmcdump:3步轻松解锁QQ音乐加密文件,实现跨设备音乐自由 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdu…...
FreeRTOS日志任务设计----LogTask 日志任务
🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》 ❄专栏传送门:《产品测评专栏》…...
别让直觉带路:Infoseek视角下的噪音过滤与火情预警实战
在舆情的世界里,最可怕的不是对手太强大,而是自己吓自己。很多时候,企业之所以“翻车”,并非因为危机本身不可控,而是因为公关团队在面对网友吐槽时过度敏感,发布了不必要的声明或做出了过激反应࿰…...
2026深度教程:如何用好 Gemini 3.1 Pro 联网搜索?实时信息获取与验证技巧全解析
目前,国内用户想稳定使用顶尖AI模型的联网搜索功能,像聚合了Gemini、ChatGPT、Grok等主流大模型的 KULAAI (m.877ai.cn) 这类镜像站提供了直接可用的方案。本文将深入剖析Gemini 3.1 Pro的联网能力,从原理机制到实操技巧ÿ…...
七、数据与存储
一、 数据库操作 1、QSqlDatabase 连接管理深度剖析 连接生命周期与内部机制 QSqlDatabase 的连接管理不走寻常路——它内部是一个全局静态哈希表,存储着所有命名连接。这带来了几个重要的设计约束: // QSqlDatabase 内部实现的核心数据结构(简化还原)// Qt 源码中通过 QH…...
告别数据焦虑:WeChatExporter如何重塑你的数字记忆管理体验
告别数据焦虑:WeChatExporter如何重塑你的数字记忆管理体验 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 当你深夜翻看三年前的聊天记录,却发现…...
Java 程序员第 2 阶段:精通 SpringBoot 整合大模型,快速搭建基础服务
前言上一阶段我们掌握了原生 API 调用,但在大规模生产环境中,使用专业的 Java 框架能大幅提升开发效率。SpringAI 和 LangChain4j 是 Java 生态中最主流的大模型集成框架。本篇文章将手把手带你精通 SpringBoot 整合大模型,快速搭建企业级 AI…...
Next-Enterprise:基于Next.js的企业级应用启动模板全解析
1. 项目概述:为什么说 Next-Enterprise 是“企业级”的?如果你正在用 Next.js 开发一个中后台管理系统、一个 SaaS 应用,或者任何需要“开箱即用”的现代企业级功能的应用,那么你大概率经历过这样的场景:项目初始化后&…...
如何在Dev-C++中配置TDM-GCC编译器
在Dev-C中配置TDM-GCC编译器的步骤如下: 步骤1:下载TDM-GCC编译器 访问 TDM-GCC官网下载适用于Windows的安装包(推荐选择64位版本:tdm-gcc-xxx.exe) 步骤2:安装TDM-GCC 运行安装程序,选择默认…...
