华为OD E卷(100分)04-流浪地球

前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

        流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。 
        1) 初始状态下所有的发动机都是未启动状态; 
        2)发动机起动的方式分为“手动启动”和“关联启动”两种方式; 
        3)如果在时刻1一个发动机被启动,下一个时刻2与之相邻的两个发动机就会被“关联启动”; 
        4)如果准备启动某个发动机时,它已经被启动了,则什么都不用做; 
        5) 发动机0与发动机N-1是相邻;
        地球联合政府准备挑选某些发动机在某些时刻进行“手动启动”,当然最终所有的发动机都会被启动。 哪些发动机最晚被启动呢?


 
输入

        第一行两个数字N和E,中间有空格 N代表部署发动机的总个数,E代表计划手动启动的发动机总个数。
        1<N<=1000,1<=E<=1000,E<=N 
        接下来共E行,每行都是两个数字T和P,中间有空格
        T代表发动机的手动启动时刻,P代表此发动机的位置编号。 0<=T<=N,0<=P<=N
 

输出


        第一行一个数字N,以回车结束 N代表最后被启动的发动机个数 
        第二行N个数字,中间有空格,以回车结束

解题思路

  1. 使用一维数组记录发动机的启动时间设置,没有设置的设置为-1;
  2. 找出最早启动的时间,以此为基点向两侧启动,并设置启动时间,然后找出下一个启动时间点的引擎进行启动,以此类推。
  3. 找出数组中最大的启动时间即为最后启动的引擎所对应的启动时间,输出引擎编号。 

题解 

Java实现

 

package huawei.e100;

import java.util.Arrays;
import java.util.Scanner;

/**
* @author arnold
* @date 2024年12月9日
*  
*/
public class T04 {
	
	public static boolean isNotDone(int[] engines) {
		return Arrays.stream(engines).anyMatch(n -> n == -1);
	}
	
	public static void run(int[] engines, int time, int  engineNum){
		while (isNotDone(engines)) {
			for (int i = 0; i < engineNum; i++) {
				if (engines[i] == time) {
					int left = i==0? (engineNum -1) : (i-1);
					int right = i==(engineNum -1)? 0 : (i+1);
					engines[left] = engines[left] == -1? (time +1): engines[left];
					engines[right] = engines[right] == -1? (time +1): engines[right];
				}
			}
			time +=1;
		}
		System.out.println(Arrays.toString(engines));
		int lastEnginesNum = 0;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < engineNum; i++) {
			if (engines[i] == time) {
				lastEnginesNum += 1;
				sb.append(i + " ");
			}
		}
		System.out.println(lastEnginesNum);
		System.out.println(sb.toString());
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int engineNum = sc.nextInt();
		int menuOpNum = sc.nextInt();
		int[] engines =  new int[engineNum];
		Arrays.fill(engines, -1);
		int minTime = engineNum;
		for (int i = 0; i< menuOpNum; i++) {
			int t = sc.nextInt();
			int p = sc.nextInt();
			engines[p] = t;
			minTime = Math.min(t, minTime);
		}
		run(engines, minTime, engineNum);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

arnold66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值