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 activationTimes[numEngines];
for (int i = 0; i < numEngines; i++) {
activationTimes[i] = INT_MAX;
}
for (int i = 0; i < manualStarts; i++) {
int time, pos;
scanf("%d %d", &time, &pos);
activationTimes[pos] = time;
}
for (int t = 0; t <= numEngines; t++) {
for (int i = 0; i < numEngines; i++) {
if (activationTimes[i] == t) {
int left = (i - 1 + numEngines) % numEngines;
int right = (i + 1) % numEngines;
if (activationTimes[left] > t + 1) {
activationTimes[left] = 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"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
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 = [];
for (let i = 0; i < numEngines; i++) {
if (activationTimes[i] !== Infinity) {
queue.push(i);
}
}
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"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: