Atcoder ABC342 E - Last Train

Last Train(最后一班火车)

时间限制:2s 内存限制:1024MB

【原题地址】

所有图片源自Atcoder,题目译文源自脚本Atcoder Better!

点击此处跳转至原题

【问题描述】

在这里插入图片描述

【输入格式】

在这里插入图片描述
在这里插入图片描述

【输出格式】

在这里插入图片描述

【样例1】

【样例输入1】

6 7
10 5 10 3 1 3
13 5 10 2 3 4
15 5 10 7 4 6
3 10 2 4 2 5
7 10 2 3 5 6
5 3 18 2 2 3
6 3 20 4 2 1

【样例输出1】

55
56
58
60
17

【样例说明1】

在这里插入图片描述

【样例2】

【样例输入2】

5 5
1000000000 1000000000 1000000000 1000000000 1 5
5 9 2 6 2 3
10 4 1 6 2 3
1 1 1 1 3 5
3 1 4 1 5 1

【样例输出2】

1000000000000000000
Unreachable
1
Unreachable

【样例说明2】

在这里插入图片描述

【样例3】

【样例输入3】

16 20
4018 9698 2850 3026 8 11
2310 7571 7732 1862 13 14
2440 2121 20 1849 11 16
2560 5115 190 3655 5 16
1936 6664 39 8822 4 16
7597 8325 20 7576 12 5
5396 1088 540 7765 15 1
3226 88 6988 2504 13 5
1838 7490 63 4098 8 3
1456 5042 4 2815 14 7
3762 6803 5054 6994 10 9
9526 6001 61 8025 7 8
5176 6747 107 3403 1 5
2014 5533 2031 8127 8 11
8102 5878 58 9548 9 10
3788 174 3088 5950 3 13
7778 5389 100 9003 10 15
556 9425 9458 109 3 11
5725 7937 10 3282 2 9
6951 7211 8590 1994 15 12

【样例输出3】

720358
77158
540926
255168
969295
Unreachable
369586
466218
343148
541289
42739
165772
618082
16582
591828

【解题思路】

老汉使用到的是DP+优先队列优化的解题方式

本题是求每个站点到N站点的最晚出发时间。
利用站点关系从N站点开始递推回去,最晚出发时间值存在与该站点最晚一班车发车时间和下一站点到N站点最晚发车时间减去该站点到下一站点的途中用时c之间的最小值,利用优先队列取大根,减少没必要的计算,优化时间复杂度,最后判断该站到N站点最晚出发时间是否被赋值,是则输出该值,否则输出"Unreachable"

代码注释有详细过程

【代码】

package ABC342_E_LastTrain;import java.io.*;
import java.util.*;public class Main {static Vector<Node>[] g;static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer st = new StreamTokenizer(br);public static int readInt() throws IOException {st.nextToken();return (int) st.nval;}public static void main(String[] args) throws IOException {int n = readInt();int m = readInt();// 用于存放对应的上一站点到达当前点的数据g = new Vector[n + 1];for (int i = 0; i < n + 1; i++) {g[i] = new Vector<>();}// 存入对应站点数据for (int i = 0; i < m; i++) {int l = readInt();int d = readInt();int k = readInt();int c = readInt();int A = readInt();int B = readInt();g[B].add(new Node(A, l, d, k, c));}// 存放从下标位置站点出发到N站点的最晚出发时间long[] dp = new long[n + 1];// 默认值为-1Arrays.fill(dp, -1);// 创建优先队列,创建为大根堆,以出发到达N站点的出发时间为比较值PriorityQueue<Pair> que = new PriorityQueue<>(new Comparator<Pair>() {@Overridepublic int compare(Pair o1, Pair o2) {if (o1.val > o2.val)return -1;else if (o1.val < o2.val)return 1;return 0;}});// dp起始点为N站点que.add(new Pair((long) 4e18, n));while (!que.isEmpty()) {Pair cur = que.poll();// 如果当前dp值已经赋值,跳过,由于优先队列排序,第一次赋值已经是最大值(最晚出发时间)if (dp[cur.x] != -1)continue;// 为当前dp值赋值dp[cur.x] = cur.val;// 遍历上一站点,求上一站点出发到N站点的最晚出发时间for (int i = 0; i < g[cur.x].size(); i++) {Node a = g[cur.x].get(i);// 该站点到N点的最晚出发时间减去上一站点到该站点的c值,求出上一站点允许的最晚出发时间long ms = cur.val - a.c;// 当这个最晚出发时间在上一站点的出发时刻表中时,求出符合上一站点的最晚出发时间if (ms >= a.l) {ms = Math.min((ms - a.l) / a.d, (a.k - 1)) * a.d + a.l;que.add(new Pair(ms, a.A));}}}// 如果dp未赋值,则说明无法到达N站点,有则输出该dp值for (int i = 1; i < n; i++) {if (dp[i] == -1)pw.println("Unreachable");elsepw.println(dp[i]);}pw.flush();pw.close();br.close();}// 存放x站点到N站点所需时间public static class Pair {long val;int x;public Pair(long val, int x) {this.val = val;this.x = x;}}// 存放到上一站点对应数据public static class Node {int A;long l;long d;long k;long c;public Node(int A, long l, long d, long k, long c) {this.A = A;this.l = l;this.d = d;this.k = k;this.c = c;}}}

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

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

相关文章

2. this 指向问题

this 指向问题 前言 当一个函数调用时&#xff0c;会创建一个执行上下文&#xff0c;这个上下文包括函数调用的一些信息(调用栈&#xff0c;传入参数&#xff0c;调用方式)&#xff0c;this就指向这个执行上下文。 this 不是静态的&#xff0c;也并不是在编写的时候绑定的&am…

java-类和对象-构造方法

类: 属性 和 方法1. 属性 与 变量 的 区别属性 位于 类中 ,变量 位于方法中,2. void 与 returnvoid 无返回值类型return 返回XXXx, return 意味着 方法 执行 结束,return 后面表达式的数据类型必须与方法的返回值类型 一致访问修饰符 返回值类型 方法名(){}3. 方法的调…

Linux笔记-1

概述 简介 Linux是现在服务器上最常用的操作系统(OS - Operating system) - 所谓的操作系统本质上也是一个软件&#xff0c;是一个可以运行其他软件的容器如果一台服务器&#xff0c;没有安装操作系统&#xff0c;此时称之为裸机。裸机可以使用&#xff0c;在使用的时候需要使…

【MQ06】延时队列与优先级队列

延时队列与优先级队列 在消息队列的最后一篇文章中&#xff0c;我们再来学习两个非常常见的队列功能。一个是延时队列&#xff0c;一个是优先级队列。它们的应用场景非常多&#xff0c;也非常有意思&#xff0c;不同的消息队列工具都提供了不同的实现&#xff0c;同样的&#x…

40. 组合总和 II(力扣LeetCode)

文章目录 40. 组合总和 II题目描述回溯算法 40. 组合总和 II 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff…

istio pod不启动及访问报RBAC错误问题解决

istio pod不启动问题解决 在kubernetes集群中安装istio之后&#xff0c;在创建的depoyment中已经使用了注入注解sidecar.istio.io/inject: true’配置&#xff0c;但是istio pod不创建&#xff0c;代码示例如下 kind: Deployment apiVersion: apps/v1 metadata:name: name-an…

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;

Sora引发安全新挑战

文章目录 前言一、如何看待Sora二、Sora加剧“深度伪造”忧虑三、Sora无法区分对错四、滥用导致的安全危机五、Sora面临的安全挑战总结前言 今年2月,美国人工智能巨头企业OpenAI再推行业爆款Sora,将之前ChatGPT以图文为主的生成式内容全面扩大到视频领域,引发了全球热议,这…

【Leetcode每日一题】二分查找 - LCR 173. 点名(难度⭐)(24)

1. 题目解析 Leetcode题目链接&#xff1a;LCR 173. 点名 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目所给的连续数组中缺失的数字即可。 2.算法原理 在这个升序的数组中&#xff0c;我们发现&#xff1a; …

LeetCode # 1207. 独一无二的出现次数

1207. 独一无二的出现次数 题目 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;arr [1,2,2,1,1,3] 输出&#xff1…

Java中Jenkins的应用简介

目录 Java中Jenkins的应用什么是Jenkins&#xff1f;Jenkins在Java开发中的应用示例代码和解决方案 Java中Jenkins的应用 Jenkins是一个流行的开源自动化服务器&#xff0c;可用于持续集成和持续交付。在Java开发中&#xff0c;Jenkins扮演着重要的角色&#xff0c;可以帮助团…

Fastadmin下拉选择菜单

下拉菜单效果图如下所示 对应的表字段为 cid int(11) unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘分类ID 1 新手 2VIP 3基金产品’ 步骤如下&#xff1a; 一、lang/zh-cn 中找到对应的文件&#xff0c;添加 配置 二、Model 中添加方法 三、控制器中添加 四、add.html中 …

机器学习高手之路:发现TensorFlow学习网站的无限可能!

介绍&#xff1a;TensorFlow是一个由Google团队开发的端到端开源机器学习平台&#xff0c;专为数值计算和机器学习而设计。以下是对TensorFlow的详细介绍&#xff1a; 开发背景与历史&#xff1a;TensorFlow起源于谷歌的神经网络算法库DistBelief。它被设计成一个灵活的深度学习…

代码随想录Day20 | Leetcode77 组合

题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#xff1a; 输入&#xff1a;n 1, k 1 …

go并发模式之----工作池/协程池模式

常见模式之四&#xff1a;工作池/协程池模式 定义 顾名思义&#xff0c;就是有固定数量的工人&#xff08;协程&#xff09;&#xff0c;去执行批量的任务 使用场景 适用于需要限制并发执行任务数量的情况 创建一个固定大小的 goroutine 池&#xff0c;将任务分发给池中的 g…

顺序表基础

⽬录 1. 课前准备 2. 顺序表概念及结构 3. 顺序表分类 4. 实现动态顺序表 正⽂开始 课前预备 1. 课程⽬标 C语⾔语法基础到数据结构与算法&#xff0c;前⾯已经掌握并具备了扎实的C语⾔基础&#xff0c;为什么要学习数据结构 课程&#xff1f;⸺通讯录项⽬ 2. 需要…

小程序分账方案:实现商户分账的简便与灵活

随着移动支付的普及和小程序的快速发展&#xff0c;越来越多的商家选择在微信小程序上开展业务。然而&#xff0c;对于一些有多个分账方的商户而言&#xff0c;如何实现快速、准确和灵活的资金分账成为了一个挑战。本文将介绍一种高效的小程序分账方案&#xff0c;帮助商户轻松…

C++ STL 优先队列(priority_queue)

1.优先队列是一种极其特殊的队列&#xff0c;他与标准的队列使用线性结构进行计算不同&#xff0c;优先队列的底层是以散列的状态&#xff08;非线性&#xff09;表现的&#xff0c;他与标准的队列有如下的区别&#xff0c;标准的队列遵从严格的先进先出&#xff0c;优先队列并…

负载均衡Ribbon和LoadBalancer

Ribbon和LoadBalancer都是用于实现负载均衡的工具&#xff0c;但它们在应用场景和实现方式上有所不同。 Ribbon 是一个客户端负载均衡器&#xff0c;它是一个Java库&#xff0c;可以在客户端应用程序中使用。通过在客户端应用程序中维护服务实例列表&#xff0c;并使用负载均衡…

修改docker默认存储位置【高版本的docker】

一、修改docker默认存储位置 1、停服务 systemctl stop docker 2、修改/etc/docker/daemon.json添加新的dcoker路径 如"data-root": "/mnt/hdd1/docker" 3、保存后重启服务&#xff1a;systemctl restart docker 二、其他服务的命令 systemctl disab…