CSP-J 2023 复赛第4题:旅游巴士

2024-02-25 10:12
文章标签 2023 csp 旅游 巴士 复赛

本文主要是介绍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题:旅游巴士的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

CSP-J选择题 - 排列组合

排列问题:有5名学生参加比赛,要求排成一排拍照,有多少种不同的排列方式?组合问题:从10本书中选出3本书送给朋友,有多少种不同的选择方式?排列问题:一个教室有7个座位,5个学生需要坐下,有多少种不同的排列方式?组合问题:从12个人中选出4个人组成一个团队,有多少种不同的方式?排列问题:一个密码由4个字母组成,字母可以重复使用,有多少种不同的排列组合?组合问题:从8个不同颜色的球中选出3个,不考虑顺

2023 CCPC(秦皇岛)现场(第二届环球杯.第 2 阶段:秦皇岛)部分题解

所有题目链接:Dashboard - The 2023 CCPC (Qinhuangdao) Onsite (The 2nd Universal Cup. Stage 9: Qinhuangdao) - Codeforces 中文题面: contest-37054-zh.pdf (codeforces.com) G. Path 链接: Problem - G - Codeforces

百度之星 2015 复赛 1001 (数长方形)

数长方形    Accepts: 595    Submissions: 1225  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形

第二天旅游线路规划和预览

第二天:从克拉玛依市乌尔禾区到五彩滩,晚上住宿贾登峪; 规划结果见下图: 1、行程安排 根据上面的耗时情况,规划一天的行程安排如下: 1)早上7:30起床,吃完早饭,8:30出发; 2)从克拉玛依市乌尔禾区到五彩滩风景区,路程229公里,车程3小时,中午12:00左右到达五彩滩景区; 3)中午吃饭1小时; 3)五彩滩游玩时间约3小时,在五彩滩游玩到16:00; 4)乘车前往阿勒泰地区布尔津县

CSP-J 之C++常用英文缩写

文章目录 C++常用英文缩写前言常用缩写解析C++ 基础缩写输入输出相关控制台 命名与类型常用函数在线测评相关 总结 C++常用英文缩写 前言 在编程比赛和日常开发中,C++是一门广泛使用的编程语言,许多英文缩写贯穿其中。了解这些缩写不仅有助于提高编程效率,还能加深对编程语言及其工作机制的理解。本文将介绍C++中常见的英文缩写,以及它们在编程中的实际含义和应用。 常用