华为OD --- 流浪地球

华为OD --- 流浪地球

  • 题目
  • 独立实现
    • 基本思路
    • 代码实现
  • 其他答案
    • 实现思路
    • 代码实现

题目

在这里插入图片描述

独立实现

基本思路

1、首先把题目给出的启动机器初始化成数组,
2、用for循环模拟每隔1s更新这个初始化数组的前后两个机器. (源码中的updateTimeCount函数)
3、for循环每次循环后会检查当前启动机器列表是否全部启动(源码中的chechList函数)并保存当前的启动机器列表(preStartMachineList)
4、如果机器没有全部启动 重复 2 - 3 流程
5、如果机器全部启动了 拿preStartMachineList中保存的值去和0 - n-1的数组做差值比较,那么这个差值肯定就是最后启动的机器列表

代码实现

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();const readline = async () => (await iter.next()).value;void (async function () {// 保存总数和启动数const [allCount, startCount] = (await readline()).split(" ");// Write your code herelet inputIndex = 0;// 记录发动机启动时间和序号的列表let machineInfo = [];while (inputIndex < Number(startCount)) {const inputLine = await readline();const [startTime, startIndex] = inputLine.split(" ");if (!machineInfo[startTime]) {machineInfo[startTime] = [];}machineInfo[startTime].push([startIndex]);inputIndex++;}machineInfo.filter((item) => item);// 用来保存全部启动之前的机器列表 和全部启动之后的机器列表之差就是最后启动的机器数let preStartMachineList = [];// console.log("machineInfo", machineInfo);const updateTimeCount = (currentIndex) => {// console.log("resultList", JSON.stringify(resultList));resultList.forEach((result) => {// 小于当前时间戳,需要更新时间if (result && result.timeCount < currentIndex) {const steps = currentIndex - result.timeCount;result.startMachine = result.startMachine.map((item) => {const centerNumber = item[Math.floor(item.length / 2)];return [centerNumber - steps < 0? allCount - Math.abs(centerNumber - steps): centerNumber - steps,...item,centerNumber + steps >= allCount? 0 + Math.abs(allCount - (centerNumber + steps)): centerNumber + steps,];});// result.timeCount = currentIndex;}});// console.log("updateTimeCount", resultList?.[0]?.startMachine);};const chechList = (list) => {const startedMachine = Array.from(new Set(list.map((item) => item.startMachine).flat(Number.MAX_SAFE_INTEGER)));// console.log("checklist", startedMachine);if (startedMachine.length >= allCount) {return true;} else {preStartMachineList = startedMachine;return false;}};const resultList = [];// console.log("machineInfo", machineInfo);for (let i = 0; i < allCount; i++) {if (machineInfo[i]) {resultList.push({timeCount: i,startMachine: machineInfo[i].map((item) => [Number(item)]),});}updateTimeCount(i);// 全部启动完成 后续循环跳过if (chechList(resultList)) {// console.log("finish", preStartMachineList);const lastStartMachineList = [];for (let j = 0; j < allCount; j++) {if (!preStartMachineList.includes(j)) {lastStartMachineList.push(j);}}console.log(lastStartMachineList.length);console.log(lastStartMachineList.join(" "));break;}}
})();

其他答案

实现思路

1、初始化一个项数为n的数组 初始化为无限大,表示机器的启动时间
2、通过两次遍历找出所有机器的启动时间 以0 2 0 6为例
3、最后得出的数组为[2,1,0,1,2,1,0,1]
3、最大的数就是最晚启动时间,输出最大数的个数以及index即可

代码实现

	const rl = require("readline").createInterface({ input: process.stdin });var iter = rl[Symbol.asyncIterator]();const readline = async () => (await iter.next()).value;void (async function () {//   保存总发动机数量和首次启动的发动机数量const [allCount, startCount] = (await readline()).split(" ").map(Number); // allCount = 8; startCount = 2const startTimeList = new Array(allCount).fill(Number.MAX_SAFE_INTEGER); // 初始化一个机器启动时间数组 这个数组有8项 [最大值,最大值,最大值....] 因为最开始的启动时间是未知的,所以这里我们初始化为最大值,表示机器启动需要无限大时间let inputIndex = 0;do {// 在这里读取机器启动时间,比如0,2 表示机器2在第0秒启动const [startTime, startIndex] = (await readline()).split(" ").map(Number);startTimeList[startIndex] = startTime;inputIndex++;} while (inputIndex < startCount);//  所以经过读取输入(0,2) (0,6)之后的startTimeList为[最大值,最大值,0,最大值,最大值,最大值,0,最大值]//   1、这里植入下对环数据结构最小启动时间的理解,可以看到第2号机器和第6号机器都是从0秒启动//   2、从第5号(实际上从任何机器开始都可以,随便举的🌰)机器的启动时间开始分析,0 1 2 3 4 5 6 7//   3、因为是环形结构,所以机器的启动时间实际就看和首批机器启动时间的绝对值取小值就行了 比如第5号机器距离2号机器 有两种方向 2 3 4 5需要3秒时间(5-2) 另一种走法需要2 1 0 7 6 5 需要5秒时间8-(5-2) 所以最终取到的是3和5之间的小值3秒//   4、但是因为6号机器也是第0秒启动 所以5号机器从6号机器出发的路径是 6 5 方向1需要6 5 1s(6-5)方向2 6 7 0 1 2 3 4 5 需要7秒(8-(6-5)) 取小值 1s//   5、综上取到的5号机器的实际启动时间是1s和3秒之间的小值 所以5号机器最终的启动时间是1s.// 按照这个方法类推,可以推出所有机器的启动时间for(let i=0;i<allCount;i++){for(let j=0;j<allCount;j++){// 方向1需要的启动时间const direction_left = Math.abs(j - i)// 方向2需要的启动时间const direction_right = allCount - Math.abs(j - i)// 取小值const minDistance = Math.min(direction_left, direction_right)startTimeList[i] = Math.min(startTimeList[i], startTimeList[j] + minDistance)}}const maxDistance = Math.max(...startTimeList)const resultList = []startTimeList.forEach((item, index) => {if(item === maxDistance) resultList.push(index)})console.log(resultList.length)console.log(resultList.join(' '))})();

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

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

相关文章

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合&#xff0c;旨在提高数据管道的质量和效率&#xff0c;从而加速数据从源头到消费的过程。白鲸开源科技&#xff0c;作为DataOps领域的领先开源原生公司&#xf…

【硬件IIC】stm32单片机利用硬件IIC驱动OLED屏幕

之前操作OLED屏幕都是用GPIO模拟IIC去驱动&#xff0c;最近打算用硬件IIC去驱动&#xff0c;于是写下这个demo,在这个过程中遇到一点小坑&#xff0c;记录一下&#xff0c;本文章非小白教程&#xff0c;所以只突出踩到的坑点&#xff0c;文章中涉及到的OLED也是网上资料写烂的&…

python如何自动加空格

首先&#xff0c;需要进行打开的一个pycharm的软件&#xff0c;可进行双击的打开该软件。 可以看到的是在当前的打开的文件中&#xff0c;格式相对较乱一下。格式不对会格式错误。 然后点击菜单栏中的“code”。 在弹出的下拉菜单中选择“reformat code”选项。 可以看到的是在…

【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

串口通信和SPI通信详解

0、背景 在现代嵌入式系统中&#xff0c;通信是不同模块之间交换数据的核心。串口通信和 SPI&#xff08;串行外设接口&#xff09;是两种常见的通信方式&#xff0c;它们各自有独特的优势和适用场景。 1、串口通信 1.1、串口通信概念 串口通信是一种常见的异步串行通信协议…

javase-17、API.数学相关

一、Math类 Math类提供了大量的静态方法来便于我们实现数学计算&#xff0c;如求绝对值、取最大或最小值等。 https://doc.qzxdp.cn/jdk/17/zh/api/java.base/java/lang/Math.html 所在模块&#xff1a;java.base所在包&#xff1a; java.lang static double abs(double a)…

答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统&#xff0c;支持多种试题类型、多种试题难度、练题、考试、补考模式&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署 二.测试环境 系统环境&#xff1a;CentOS、 运行环境&#x…

浅谈仓颉语言的优劣

仓颉语言&#xff0c;作为华为自研的新一代编程语言&#xff0c;以其高效、安全、现代化的特点&#xff0c;引起了广泛的关注。 仓颉语言的优势 高效并发 仓颉语言的一大亮点是其轻松并发的能力。它实现了轻量化用户态线程和并发对象库&#xff0c;使得高效并发变得轻松。仓颉…

Sass系统数据隔离的三种方式

1.完全独立的数据库 为每一个租户单独部署一个数据库 优点&#xff1a;达到了真正的按租户进行隔离&#xff0c;不同租户之间相互没有影响&#xff0c;可以针对一些特殊租户例如大客户做一些定制化的开发&#xff0c;计费相对简单&#xff0c;按照资源使用进行计费。 缺点&…

FFmpeg 主要结构体剖析

FFmpeg 探索之旅 FFmpeg 主要结构体剖析 FFmpeg 探索之旅前言1、AVFormatContext2、AVCodecContext3、AVCodec4、AVStream5、AVPacket6、AVFrame7、AVCodecParameters7、SwsContext8、AVIOContext9、AVRational 总结 前言 嘿&#xff0c;各位小伙伴&#xff01;在如今这个多媒…

经典电荷泵/Charge pump——1998.JSSC

电路结构 工作原理 M3 and M4 are the series switches, and M5, M6 switch to the highest voltage. If M5 and M6 are missing, having a large capacitor is of absolute necessity, because must always stay between 2 Vin and 2Vin - Uj to avoid switching on the vert…

Swin transformer 论文阅读记录 代码分析

该篇文章&#xff0c;是我解析 Swin transformer 论文原理&#xff08;结合pytorch版本代码&#xff09;所记&#xff0c;图片来源于源paper或其他相应博客。 代码也非原始代码&#xff0c;而是从代码里摘出来的片段&#xff0c;配上简单数据&#xff0c;以便理解。 当然&…

GPT-Omni 与 Mini-Omni2:创新与性能的结合

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;各种模型和平台应运而生&#xff0c;以满足从个人用户到企业级应用的多样化需求。在这一领域&#xff0c;GPT-Omni 和 Mini-Omni2 是两款备受瞩目的技术产品&#xff0c;它们凭借独特的设计和强大的功能&#xff0c;在…

龙迅#LT7911E适用于EDP/DP/TPYE-C转MIPIDSI应用,支持图像处理功能,内置I2C,主应用副屏显示,投屏领域!

1. 描述 LT7911E 是一款高性能 eDP 转 MIPI D-PHY 转换器&#xff0c;旨在将 eDP 源连接到 MIPI 显示面板。 LT7911E 集成了一个符合 eDP1.4 标准的接收器&#xff0c;支持 1.62Gbps 至 5.67Gbps 的输入数据&#xff0c;以 270Mbps 的递增步长&#xff0c;以及一个 2 端口 D…

C语言——实现求出最大值

问题描述&#xff1a;利用C语言自定义函数求出一维数组里边最大的数字 //利用函数找最大数#include<stdio.h>int search(int s[9]) //查找函数 {int i , max s[0] , max_xia 0;for(i0;i<9;i){if(s[i] > max){max_xia i;max s[max_xia];}}return max; } in…

解锁 draw.io 流程图制作工具Docker私有化部署(2/2)

一、draw.io 流程图制作工具简介 &#xff08;一&#xff09;基础介绍 draw.io 是一款备受青睐的开源流程图软件&#xff0c;它有着诸多优点。首先&#xff0c;其界面十分整洁有序&#xff0c;完全没有广告的干扰&#xff0c;并且所有功能都是免费向用户开放的&#xff0c;这一…

[HNCTF 2022 Week1]baby_rsa

源代码&#xff1a; from Crypto.Util.number import bytes_to_long, getPrime from gmpy2 import * from secret import flag m bytes_to_long(flag) p getPrime(128) q getPrime(128) n p * q e 65537 c pow(m,e,n) print(n,c) # 62193160459999883112594854240161159…

docker run命令大全

docker run命令大全 基本语法常用选项基础选项资源限制网络配置存储卷和挂载环境变量重启策略其他高级选项示例总结docker run 命令是 Docker 中最常用和强大的命令之一,用于创建并启动一个新的容器。该命令支持多种选项和参数,可以满足各种使用场景的需求。以下是 docker ru…

Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析

在Java中&#xff0c;JDBC的一些方法因为安全问题、性能问题或者因为引入了更好的替代方法已经被标记为过时&#xff08;Deprecated&#xff09;。 以下是一些被过时的JDBC方法以及它们的替代方案&#xff1a; 1.DriverManager.getDrivers(): 这个方法用于获取所有当前注册的J…

详细指南:在Ubuntu 20.04 ROS 1环境下设置和使用OpenNI2 SDK

详细指南&#xff1a;在Ubuntu 20.04 ROS 1环境下设置和使用OpenNI2 SDK 要在Ubuntu 20.04系统上使用ROS 1环境中的OpenNI2 SDK&#xff0c;您需要按照一系列有组织的步骤进行操作&#xff0c;以确保软件和驱动正确安装&#xff0c;并配置好相应的开发环境。以下是详细的步骤说…