C解法

步骤分析:

输入解析:

numEngines 表示发动机的数量。
manualStarts 表示手动启动的发动机数量。
接下来的输入中,我们获得每个手动启动的发动机的启动时间和位置。
初始化:

用一个数组 activationTimes 来记录每个发动机的启动时间,初始化为 INT_MAX,表示这些发动机还没有启动。
手动启动:

对于每个手动启动的发动机,直接将其启动时间更新到数组中。
传播启动时间:

使用一个模拟的传播过程。对每个时间 t,遍历所有发动机。如果某个发动机在时间 t 启动,那么它的左右相邻发动机将在时间 t + 1 启动。如果这些相邻发动机的启动时间未被设置过(即仍为 INT_MAX),则更新其启动时间。
传播过程会持续直到没有更多的发动机可以被启动。
找出最后启动的发动机:

遍历 activationTimes 数组,找出最大的启动时间 latestTime。
然后遍历一次 activationTimes 数组,找出所有在 latestTime 启动的发动机并记录它们的位置。
输出结果:

输出最后启动的发动机的数量。
输出最后启动的发动机的编号。

#include 
#include 
#include 

int main() {
    int numEngines, manualStarts;
    
    // 读取输入的发动机数量和手动启动的数量
    scanf("%d %d", &numEngines, &manualStarts);

    // 初始化发动机的启动时间数组,初始值为 INT_MAX,表示尚未启动
    int activationTimes[numEngines];
    for (int i = 0; i < numEngines; i++) {
        activationTimes[i] = INT_MAX;  // 使用 INT_MAX 来表示尚未启动
    }

    // 读取手动启动的发动机的信息,并设置其启动时间
    for (int i = 0; i < manualStarts; i++) {
        int time, pos;
        scanf("%d %d", &time, &pos);  // 读取启动时间和启动位置
        activationTimes[pos] = time;  // 设置该发动机的启动时间
    }

    // 模拟传播启动时间
    // 运行最多 numEngines 次来传播启动时间(可以认为这就是传播的最大可能步数)
    for (int t = 0; t <= numEngines; t++) {
        for (int i = 0; i < numEngines; i++) {
            if (activationTimes[i] == t) {  // 如果发动机 i 在时间 t 启动
                // 计算左邻居和右邻居的位置(环形结构)
                int left = (i - 1 + numEngines) % numEngines;
                int right = (i + 1) % numEngines;

                // 如果左邻居尚未启动,则设置它的启动时间为 t+1
                if (activationTimes[left] > t + 1) {
                    activationTimes[left] = t + 1;
                }

                // 如果右邻居尚未启动,则设置它的启动时间为 t+1
                if (activationTimes[right] > t + 1) {
                    activationTimes[right] = t + 1;
                }
            }
        }
    }

    // 找出最后启动的时间
    int latestTime = 0;
    for (int i = 0; i < numEngines; i++) {
        if (activationTimes[i] > latestTime) {  // 找到最大的启动时间
            latestTime = activationTimes[i];
        }
    }

    // 统计并记录最后启动的发动机数量及其位置
    int count = 0;
    for (int i = 0; i < numEngines; i++) {
        if (activationTimes[i] == latestTime) {
            count++;  // 统计最后启动的发动机数量
        }
    }

    // 输出最后启动的发动机数量
    printf("%d\n", count);

    // 输出最后启动的发动机的位置(按升序排列)
    for (int i = 0; i < numEngines; i++) {
        if (activationTimes[i] == latestTime) {
            printf("%d ", i);  // 输出最后启动的发动机编号
        }
    }
    printf("\n");

    return 0;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

主要步骤:

初始化:

读取输入的发动机数量 numEngines 和手动启动的发动机数量 manualStarts。
初始化一个数组 activationTimes,用来记录每个发动机的启动时间,初始值设为 Infinity(表示尚未启动)。
处理手动启动:

对每一个手动启动的发动机,直接更新对应位置的启动时间。
传播启动时间:

通过 BFS(广度优先搜索)模拟启动时间的传播。
从所有已知启动的发动机开始,逐步更新它们左右相邻发动机的启动时间,直到没有更多的发动机可以被更新。
找出最后启动的发动机:

计算出所有发动机中的最大启动时间。
找出所有启动时间等于最大时间的发动机,按升序输出它们的编号。

const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

let inputs = [];  // 用来存储输入数据
let manualStarts = 0;  // 记录手动启动的发动机数量

// 监听每一行输入
rl.on("line", (line) => {
    // 第一行输入包含发动机数量和手动启动的数量
    if (inputs.length === 0) {
        const [numEngines, starts] = line.split(" ").map(Number);
        manualStarts = starts;
        // 初始化输入数据结构
        inputs.push({ numEngines, manualStarts, activationTimes: Array(numEngines).fill(Infinity) });
    } else {
        // 对于每个手动启动的发动机,更新启动时间
        const [time, pos] = line.split(" ").map(Number);
        const { activationTimes } = inputs[0];  // 获取当前的启动时间数组
        activationTimes[pos] = time;

        // 如果所有手动启动的发动机已经被处理
        if (inputs[0].activationTimes.filter(t => t !== Infinity).length === manualStarts) {
            activateEngines(inputs[0].numEngines, activationTimes);  // 开始激活发动机
        }
    }
});

// 激活所有发动机的函数
function activateEngines(numEngines, activationTimes) {
    const queue = [];  // 使用队列来进行广度优先搜索(BFS)

    // 将所有已经手动启动的发动机放入队列
    for (let i = 0; i < numEngines; i++) {
        if (activationTimes[i] !== Infinity) {
            queue.push(i);
        }
    }

    // BFS过程,传播启动时间
    while (queue.length > 0) {
        const current = queue.shift();  // 获取当前正在传播的发动机
        const neighbors = [
            (current - 1 + numEngines) % numEngines,  // 左邻居
            (current + 1) % numEngines               // 右邻居
        ];

        // 对左右邻居进行时间更新
        neighbors.forEach(neighbor => {
            // 如果邻居尚未启动,或者启动时间可以被更新
            if (activationTimes[neighbor] > activationTimes[current] + 1) {
                activationTimes[neighbor] = activationTimes[current] + 1;
                queue.push(neighbor);  // 将更新过的邻居加入队列,继续传播
            }
        });
    }

    // 找出最大的启动时间
    const latestTime = Math.max(...activationTimes);

    const lastEngines = [];
    // 找到所有在最大启动时间时启动的发动机
    for (let i = 0; i < numEngines; i++) {
        if (activationTimes[i] === latestTime) {
            lastEngines.push(i);
        }
    }

    // 输出结果:最后启动的发动机数量
    console.log(lastEngines.length);
    // 输出最后启动的发动机编号(按升序排列)
    console.log(lastEngines.sort((a, b) => a - b).join(" "));
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144512577"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!