蓝桥杯第2152题——红绿灯

问题描述

爱丽丝要开车去上班, 上班的路上有许多红绿灯, 这让爱丽丝很难过。为 了上班不迟到, 她给自己的车安装了氮气喷射装置。现在她想知道自己上班最 短需要多少时间。

爱丽丝的车最高速度是 \frac{1}{v} 米每秒, 并且经过改装后, 可以瞬间加速到小于 等于最高速的任意速度, 也可以瞵间停止。

爱丽丝家离公司有 N 米远, 路上有 M 个红绿灯, 第 i 个红绿灯位于离爱 丽丝家 Ai​ 米远的位置, 绿灯持续 Bi​ 秒, 红灯持续 Ci​ 秒。在初始时 (爱丽丝开始计时的瞬间), 所有红绿灯都恰好从红灯变为绿灯。如果爱丽丝在绿灯变红时刚好到达红绿灯, 她会停下车等红灯, 因为她是遵纪守法的好市民。

氮气喷射装置可以让爱丽丝的车瞬间加速到超光速 (且不受相对论效应的影响!), 达到瞬移的效果, 但是爱丽丝是遵纪守法的好市民, 在每个红绿灯前她都会停下氮气喷射, 即使是绿灯, 因为红绿灯处有斑马线, 而使用氮气喷射 装置通过斑马线是违法的。此外, 氮气喷射装置不能连续启动, 需要一定时间 的冷却, 表现为通过 K 个红绿灯后才能再次使用。(也就是说, 如果 K=1, 就 能一直使用啦!) 初始时, 氮气喷射装置处于可用状态。

输入格式

第一行四个正整数 N、M、K、V, 含义如题面所述。

接下来 M 行, 每行三个正整数 Ai 、 Bi 、 Ci,含义如题面所述。

输出格式

输出一个正整数 T, 表示爱丽丝到达公司最短需要多少秒。

样例输入

90 2 2 2
30 20 20 
60 20 20

样例输出

80

样例说明

爱丽丝在最开始直接使用氮气喷射装置瞬间到达第一个红绿灯, 然后绿灯通过, 以最高速行进 60 秒后到达第二个红绿灯, 此时绿灯刚好变红, 于是她等 待 20 秒再次变为绿灯后通过该红绿灯, 此时氮气喷射装置冷却完毕, 爱丽丝再 次使用瞬间到达公司, 总共用时 80 秒。

评测用例规模与约定

对于 30% 的数据, N < 100 ; M < 10 ; M < K ; V = 1.

对于 60% 的数据, N ≤ 1000; M ≤ 100; K ≤ 50; Bi​,Ci ​≤ 100; V ≤ 10.

对于 100% 的数据, 0 < N ≤ 10^8; M ≤ 1000; K ≤ 1000; 0 < Bi​,Ci ​≤ 10^6; V ≤ 10^6; 0 < Ai ​< N; 对任意 i < j, 有 Ai​ < Aj​.

解题思路

动态规划方程

这是一道比较明显的动态规划,对于到达第 i 个路口,可以考虑开车过来还是闪现过来。

如果是开车过来,那么dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + s + t

如果是闪现过来,那么意味着前k个路口必须都是开车过来的,从i-1路口闪现过来

那么dp[i][1] = min(dp[i - k][0], dp[i - k][1]) + S + t

处理细节

接下来就是一些细节,比如说如何计算t,如何计算大S。

根据具体代码中calc方法中的算式,当前时间对红绿灯组合时间取余,可以得到当前时间在一个红绿灯周期中的位置,如果超过了绿灯时间,就要等红灯,进行简单计算即可。

对于大S,我们先取到达i - k节点最短的时间,并从i - k节点开始开始往后加,只要利用calc方法正常循环增加每一条路和红绿灯的时间,就可以得到到达i节点的时间,由于i - 1到i节点是闪现过来的,所以这段距离特殊处理为0即可。

另外,由于从最后一个路口到公司也可以使用氮气喷射,所以我们将公司节点额外添加并特殊处理红路灯时间即可,笔者定义绿灯时间为1,红灯时间为0,可以达到不用等红绿灯的效果。

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long n = sc.nextInt();// 额外添加一个特殊的公司节点int m = sc.nextInt() + 1;int k = sc.nextInt();long v = sc.nextInt();long[] a = new long[m + 1], b = new long[m + 1], c = new long[m + 1];for (int i = 1; i <= m - 1; i++) {// 将所有距离乘v就可以当做单位1来计算a[i] = sc.nextInt() * v;b[i] = sc.nextInt();c[i] = sc.nextInt();}// 为公司定义一个特殊的红绿灯时间a[m] = n * v; b[m] = 1; c[m] = 0;// 以下dp状态均表示等完i路口红绿灯后的时间// dp[i][0] 表示从i-1号节点开车过来// dp[i][1] 表示从i-1号节点闪现过来long[][] dp = new long[m + 1][2];for (int i = 1; i <= m; i++) {long s1 = a[i] - a[i - 1];long time1 = calc(dp[i - 1][0], s1, b[i], c[i]);long time2 = calc(dp[i - 1][1], s1, b[i], c[i]);// 从到达i-1节点的最短时间直接开车过来dp[i][0] = Math.min(time1, time2);// 从i-1节点闪现过来,要从i-k节点一直开车过来int po = Math.max(0, i - k);// 在位置po选一个最短的做起始时间time3long time3 = Math.min(dp[po][0], dp[po][1]);// 起点区间:[po, i-1]for (int j = po; j <= i - 1; j++) {long s = a[j + 1] - a[j];// 如果是i-1号路口,表示闪现,距离设置为0if (j == i - 1) {s = 0;}time3 = calc(time3, s, b[j + 1], c[j + 1]);}dp[i][1] = time3;}System.out.print(Math.min(dp[m][0], dp[m][1]));}// 起始时间start,返回到达下一个路口等完红绿灯的时间public static long calc(long start, long s, long green, long red) {// res 初始化为到达路口的时间long res = start + s;long t = (start + s) % (green + red);// 根据消除多轮红绿灯组合的剩余时间,计算等红灯时间if (t >= green) {res += (green + red) - t;}return res;}
}

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

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

相关文章

Sonar下启动发生错误,elasticsearch启动错误

Download | SonarQube | Sonar (sonarsource.com) 1.首先我的sonar版本为 10.4.1 &#xff0c;java版本为17 2.sonar启动需要数据库,我先安装了mysql, 但是目前sonar从7.9开始不支持mysql&#xff0c;且java版本要最少11,推荐使用java17 3.安装postsql,创建sonar数据库 4.启…

分布式锁的实现

一、背景 在分布式系统中,一个应用部署在多台机器中,在某些场景下,为了保证数据的一致性,要求在同一时刻,同一任务只在一个节点上运行,即保证某个行为在同一时刻只能被一个线程执行。在单机单进程多线程环境下,通过锁很容易做到,比如 mutex、spinlock、信号量 等。在多…

Chapter 1-10. Introduction to Congestion in Storage Networks

Common Questions on Storage Networks This section covers some questions that we have been frequently asked and our responses to those questions. 本节包括我们经常被问到的一些问题以及我们对这些问题的答复。 Q: What is the difference between a network and a …

ArcGIS Desktop使用入门(三)图层右键工具——可见比例范围

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

如何下载和安装Google Chrome扩展插件:一步步指南

Google Chrome 插件为我们提供了这样的便利&#xff0c;但有时找到一个有用的插件后&#xff0c;我们可能需要将其下载到本地以便离线使用或备份。 一、为什么可以从Google Chrome商店直接下载插件&#xff1f; Google Chrome 扩展插件主要通过Chrome Web Store分发&#xff…

scala---面向对象(类,对象,继承,抽象类,特质)

一、类&#xff08;class&#xff09;和 对象&#xff08;object&#xff09; 1、类 类就是对客观的一类事物的抽象。用一个class关键字来描述和Java一样&#xff0c;在这个类中可以拥有这一类事物的属性&#xff0c;行为等等。 2、为什么要有对象 在java中的一个class既可…

流氓软件清理绝杀全家桶

下载地址&#xff1a;流氓软件清理绝杀全家桶.zip 网上仍有不少软件中携带流氓软件&#xff0c;甚至某些所谓的大厂出品的工具中也会有一些捆绑&#xff01; 对于玩机经验不太丰富的小白来说&#xff0c;也许一不小心&#xff0c;桌面就会被某些流氓软件搞得乌烟瘴气&#xf…

实验笔记之——RGBD GS-ICP SLAM配置与测试

《RGBD GS-ICP SLAM》是最新开源的一个3DGS-SLAM工作&#xff0c;通过利用GICP来实现当前帧gaussian与已mapping的gaussian进行匹配进行位姿的估算&#xff0c;并通过关键帧的选择策略来进一步提升performance~ Use G-ICP to align the current frame with the 3D GS map whic…

基于人脸识别的发型推荐系统代码实现

1.摘要 本文介绍了一个基于人脸识别技术的发型推荐系统的实现与分析。该系统利用Python编程语言和相关库&#xff0c;结合Face人脸识别API&#xff0c;实现了用户上传照片后的性别识别、脸型分析和发型推荐功能。首先&#xff0c;用户通过Tkinter GUI界面选择上传照片&#xff…

gpt在线网页版最全收录

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序)

文章目录 IP 地址基本概念源IP地址 & 目的IP地址 MAC 地址基本概念源MAC地址 & 目的MAC地址 端口号基本概念源端口号 & 目的端口号 TCP & UDP 协议基本概念TCP 与 UDP 的抉择 网络字节序大端、小端字节序 &#x1f396; 博主的CSDN主页&#xff1a;Ryan.Alask…

DAY8|344.反转字符串、541. 反转字符串II、151.翻转字符串里的单词

344.反转字符串、541. 反转字符串II、151.翻转字符串里的单词 344.反转字符串541. 反转字符串II151.翻转字符串里的单词 344.反转字符串 本题是字符串基础题目&#xff0c;就是考察 reverse 函数的实现&#xff0c;同时也明确一下 平时刷题什么时候用 库函数&#xff0c;什么时…

1.9 数据结构之 并查集

编程总结 在刷题之前需要反复练习的编程技巧&#xff0c;尤其是手写各类数据结构实现&#xff0c;它们好比就是全真教的上乘武功 本栏目为学习笔记参考&#xff1a;https://leetcode.cn/leetbook/read/disjoint-set/oviefi/ 1.0 概述 并查集&#xff08;Union Find&#xff09…

vue2/vue3定时处理某个方法

一、vue2定时器 在Vue 2中&#xff0c;你可以使用mounted生命周期钩子来启动一个定时器&#xff0c;并在beforeDestroy钩子中清除它&#xff0c;以确保不会发生内存泄漏。以下是一个简单的例子&#xff1a; export default {data() {return {timerId: null};},mounted() {// …

# Nacos 服务发现-快速入门-测试多实例 Ribbon 负载均衡

Nacos 服务发现-快速入门-测试多实例 Ribbon 负载均衡 1、修改 服务生产模块 quickstart_provider 子工程中的 配置文件 application.yaml port: ${port:56010} # 启动端口 # 修改为动态传参&#xff0c;如果未传参数&#xff0c;默认端口为 56010 2、在 idea 中&#xff0c;…

内网渗透-Linux内网渗透

系列文章目录 文章目录 系列文章目录一、Linux内网渗透二、提权 2.1 利用内核漏洞进行提权2.2 利用文件权限配置不当进行提权2.3 利用SUID程序进行提权 三、隧道 3.1 SSH3.2 nc/ncat3.3 portmap3.4 portfw 四、反弹shell 4.1 bash4.2 netcat4.3 php4.4 perl4.5 python4.6 ruby4…

Prime (2021): 2

前言 这个靶机有亿点难,收获很多。打靶的时候&#xff0c;前面很顺&#xff0c;到创建ssh公钥之后就一点不会了。 1 01 arp扫描&#xff0c;发现有一个130&#xff0c;再查看端口 有22&#xff0c;80&#xff0c;129&#xff0c;445&#xff0c;10123 dirb扫描目录 这…

蓝牙技术在智能硬件中应用火热,你的蓝牙适配测试如何解决?

蓝牙技术在物联网中的应用非常广泛&#xff0c;可以为人们的生活和工作带来更多的便利和智能化体验&#xff0c;主要五大核心应用场景&#xff0c;具体如下&#xff1a; 1、智能家居 通过蓝牙连接智能家居设备&#xff0c;如智能灯泡、智能插座、智能恒温器等&#xff0c;可以…

chrome截屏插件用到的JavaScript 库,图像处理库,

包含的库介绍 javascripts\libs\ InboxSDK.js InboxSDK 是一个 JavaScript 库&#xff0c;用于在 Gmail 中添加应用菜单项目。它允许开发者向 Gmail 的应用菜单添加自己的项目&#xff0c;这些项目通常用于提供高级可折叠面板、导航或发送用户到已注册的不同路由 diigo-image-…