当前位置:   article > 正文

华为OD机试 - 用户调度(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】_js 华为od 用户调度

js 华为od 用户调度

用户调度

题目

在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。
假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略。
不同的策略会消耗不同的系统资源,请你根据如下规则进行用户调度,并返回总的消耗资源数。
规则是:
相邻的用户不能使用相同的调度策略,例如:
第一个用户使用A策略,则第二个用户只能使用BC策略。
对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值,例如:
某用户分别使用A B C策略的系统消耗,分别为15 8 17
每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优,
如果有多个满足要求的策略,选最后一个。

输入

第一行表示用户个数N
接下来表示每一行表示一个用户分别使用三个策略的资源消耗
resA resB resC

输出

最优策略组合下的总的系统消耗资源数

示例一

输入

3
15 8 17
12 20 9
11 7 5
  • 1
  • 2
  • 3
  • 4

输出

24
  • 1

说明

1`号用户使用B策略
`2`号用户使用C策略
`3`号用户使用B策略
系统资源消耗`8+9+7
  • 1
  • 2
  • 3
  • 4

Code

const readline = require('readline');

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

let n;
let strings = [];

rl.on('line', function(line){
  if (!n) {
    n = parseInt(line.trim());
  } else {
    strings.push(line.trim());
  }

  if (strings.length === n) {
    solveMethod(n, strings);
    rl.close();
  }
});

function solveMethod(n, strings) {
  let res = [];

  for (let i = 0; i < n; ++i) {
    let split = strings[i].split(" ");
    let map = new Map();
    for (let j = 0; j < split.length; j++) {
      map.set(parseInt(split[j]), j);
    }
    res.push(map);
  }

  let sum = Array.from(res[0].keys())[0];
  let type = res[0].get(sum);

  if (res.length > 1) {
    for (let i = 1; i < res.length; ++i) {
      let keyList = Array.from(res[i].keys());
      let resN = keyList[0];
      let typeN = res[i].get(resN);
      if (typeN !== type) {
        sum += resN;
        type = typeN;
      } else {
        sum += keyList[1];
        type = res[i].get(keyList[1]);
      }
    }
  }

  console.log(sum);
}

  • 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

解题思路

该代码从控制台读取输入,第一行表示待处理的字符串数组的数量,接下来的每一行都是一个字符串数组

solveMethod函数中,首先将每个字符串数组转换为一个Map,其中键为该元素的值,值为该元素的索引。这个步骤是为了后面方便根据值来查找索引。

接着,从第一个Map中取出第一个键值对,将它们分别作为sumtype的初始值。如果有多个Map,则遍历每个Map,每次比较当前Map中第一个键值对的索引和前一个Map中最后一个键值对的索引是否相等。如果相等,则将当前Map中第二个键值对的值加到sum中,并将当前键值对的索引作为type的新值;否则,将当前键值对的值加到sum中,并将当前键值对的索引作为type的新值。

最后输出sum即为所求。

版权说明

试题来源:华为 OD 联盟整理收集

题解:解题思路代码 为原创内容,该部分版权由 OD 联盟共同拥有,并授权组内成员发布。

目标:

推荐阅读
相关标签