华为OD 流浪地球

题目描述

流浪地球计划在赤道上均匀部署了 N 个转向发动机,按位置顺序编号为 0 ~ N

  1. 初始状态下所有的发动机都是未启动状态
  2. 发动机启动的方式分为“手动启动”和“关联启动”两种方式
  3. 如果在时刻 1 一个发动机被启动,下一个时刻 2 与之相邻的两个发动机就会被“关联启动”
  4. 如果准备启动某个发动机时,它已经被启动了,则什么都不用做
  5. 发动机 0 与发动机 N-1 是相邻的

地球联合政府准备挑选某些发动机在某些时刻进行“手动启动”。当然最终所有的发动机都会被启动。哪些发动机最晚被启动呢?

输入描述

第一行两个数字 N 和 E,中间有空格

  • N 代表部署发动机的总个数,1 < N ≤ 1000
  • E 代表计划手动启动的发动机总个数,1 ≤ E ≤ 1000,E ≤ N

接下来共 E 行,每行都是两个数字 T 和 P,中间有空格

  • T 代表发动机的手动启动时刻,0 ≤ T ≤ N
  • P 代表次发动机的位置编号,0 ≤ P < N

输出描述

第一行一个数字 N, 以回车结束

  • N 代表最后被启动的发动机个数

第二行 N 个数字,中间有空格,以回车结束

  • 每个数字代表发动机的位置编号,从小到大排序

用例1

输入

8 2
0 2
0 6

输出

2
0 4

说明

8个发动机;
时刻0启动(2,6);
时刻1启动(1,3,5,7)(其中1,3被2关联启动,5,7被6关联启动);
时刻2启动(0,4)(其中0被1,7关联启动,4被3,5关联启动);
至此所有发动机都被启动,最后被启动的有2个,分别是0和4。

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    static Map<Integer, Set<Integer>> toDeal = new HashMap<Integer, Set<Integer>>();
    static Map<Integer, Set<Integer>> hasDeal = new
    HashMap<Integer, Set<Integer>>();
    static int total = 0;
    static int all = 0;
    static int[] dealNums;//标记是否已启动

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int [] firstLine = Arrays.stream(in.nextLine().split(" ")).mapToInt(
                               Integer::parseInt).toArray();
        all = total = firstLine[0];
        dealNums = new int[total];
        int k = firstLine[1];
        for (int i = 0; i < k; i++) {
            int [] nums = Arrays.stream(in.nextLine().split(" ")).mapToInt(
                              Integer::parseInt).toArray();
            Set<Integer> set = toDeal.get(nums[0]);
            if (set == null) {
                set = new HashSet<Integer>();
            }
            set.add(nums[1]);
            toDeal.put(nums[0], set);
        }


        for (int i = 0; i < all; i++) {
            if (total > 0) {
                start(i);
            } else {
                System.out.println(hasDeal.get(i - 1).size());
                Set<Integer> set = hasDeal.get(i - 1);
                StringBuilder builder = new StringBuilder();
                set.forEach(e->{
                    builder.append(e).append(" ");
                });
                System.out.println(builder.toString().substring(0, builder.length() - 1));
                break;
            }
        }
    }

    //i时刻启动的发动机
    public static void start(int i) {
        if (toDeal.get(i) != null) {
            Set<Integer> set = toDeal.get(i);
            set.forEach(e-> {
                //判断是否已处理过
                if (dealNums[e] == 0) {
                    //处理当前时间i
                    dealNums[e] = 1;
                    Set<Integer> subSet;
                    if (hasDeal.get(i) == null) {
                        subSet = new HashSet<Integer>();
                    } else {
                        subSet = hasDeal.get(i);
                    }
                    subSet.add(e);
                    hasDeal.put(i, subSet);
                    total --;
                    //添加下一个时间段要处理的发动机到集合toDeal
                    Set<Integer> nextDeal = toDeal.get(i + 1);
                    if (nextDeal == null) {
                        nextDeal = new HashSet<Integer>();
                    }
                    if (dealNums[(e + 1) % all] == 0) {
                        nextDeal.add((e + 1) % all);
                    };
                    if (dealNums[(e + all - 1) % all] == 0) {
                        nextDeal.add((e + all - 1) % all);
                    };
                    toDeal.put(i + 1, nextDeal);
                }
            });
        }
    }
}

<think>好的,用户想了解如何用C#写华为OD的“流浪地球题目。首先,我需要明确用户提到的具体题目内容,因为“流浪地球”可能涉及不同的算法或场景。不过,华为OD题目通常属于编程题,可能涉及数据结构、算法等。 首先,我需要假设用户可能指的是某个具体的编程问题,比如模拟行星发动机启动顺序、资源调度,或者路径规划等。由于没有具体的题目描述,可能需要做一些合理的推测。 接下来,用户可能希望得到一个C#的解决方案示例,包括代码结构和关键算法。考虑到华为OD题目通常注重算法效率和正确性,代码需要符合这些要求。 然后,我需要回忆类似的华为OD题目结构,比如可能需要处理输入输出、排序、动态规划、图算法等。例如,假设题目是关于按照一定条件启动发动机,计算最短时间或最优顺序。 如果用户没有提供具体题目,我需要建议用户提供更多细节,或者给出一个常见类型的示例,比如资源分配或任务调度问题,并展示相应的C#代码框架。 同时,需要注意代码的可读性和注释,帮助用户理解实现思路。可能还需要解释算法的时间复杂度和优化点,以符合华为OD的考核标准。 最后,确保回答符合格式要求,使用正确的LaTeX数学表达式,结构清晰,分步骤解释,并检查是否有遗漏的细节,确保用户能根据回答进行进一步开发或调整。</think>关于“华为OD流浪地球题目,由于没有公开具体的题目描述,我暂时无法提供完整代码。但根据常见华为OD算法题型,我们可以假设一个类似场景进行示例: **假设题目要求**:需要计算行星发动机启动顺序,使得在最短时间内达到逃逸速度。每个发动机启动时间和推力值,需优先启动高推力发动机。 ```csharp using System; using System.Collections.Generic; using System.Linq; class EngineScheduler { // 发动机数据结构 class Engine { public int Id { get; set; } public int Power { get; set; } public int StartTime { get; set; } } static void Main() { // 示例输入:发动机编号,推力,启动耗时 List<Engine> engines = new List<Engine> { new Engine { Id = 1, Power = 150, StartTime = 3 }, new Engine { Id = 2, Power = 200, StartTime = 5 }, new Engine { Id = 3, Power = 180, StartTime = 2 } }; // 关键算法:按推力降序排序(同等推力选启动快的) var sortedEngines = engines.OrderByDescending(e => e.Power) .ThenBy(e => e.StartTime); // 计算总耗时(前序发动机启动时间累加) int totalTime = 0; foreach (var engine in sortedEngines) { totalTime += engine.StartTime; Console.WriteLine($"发动机{engine.Id} 启动完成,累计耗时:{totalTime}小时"); } Console.WriteLine($"\n总逃逸准备时间:{totalTime}小时"); } } ``` **代码特征说明**: 1. 数据结构:使用`Engine`类封装发动机属性 2. 排序策略:`OrderByDescending`实现推力优先的贪心算法 3. 时间复杂度:$O(n \log n)$(主要来自排序操作) 4. 扩展性:可通过修改排序条件适应不同题目要求 **典型优化点**: 1. 若存在并行启动条件,需使用优先队列(`PriorityQueue`) 2. 若涉及路径规划,需结合Dijkstra算法 3. 资源冲突处理可增加状态检查 建议提供具体题目描述,我可以给出更精准的解决方案。华为OD常见考点包括: - 滑动窗口(如能量分配问题- 回溯算法(如行星路径探索) - 动态规划(如资源最优分配) - 图论算法(如发动机网络连通性) 如果需要特定算法实现,请提供更详细的问题描述,我会提供对应C#代码及复杂度分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值