赞
踩
在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。
假设由N
个待串行用户,每个用户可以使用A/B/C
三种不同的调度策略。
不同的策略会消耗不同的系统资源,请你根据如下规则进行用户调度,并返回总的消耗资源数。
规则是:
相邻的用户不能使用相同的调度策略,例如:
第一个用户使用A
策略,则第二个用户只能使用B
和C
策略。
对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值,例如:
某用户分别使用A B C
策略的系统消耗,分别为15 8 17
,
每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优,
如果有多个满足要求的策略,选最后一个。
第一行表示用户个数N
接下来表示每一行表示一个用户分别使用三个策略的资源消耗
resA resB resC
最优策略组合下的总的系统消耗资源数
3
15 8 17
12 20 9
11 7 5
24
1`号用户使用B策略
`2`号用户使用C策略
`3`号用户使用B策略
系统资源消耗`8+9+7
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); }
该代码从控制台读取输入,第一行表示待处理的字符串数组的数量,接下来的每一行都是一个字符串数组
在solveMethod
函数中,首先将每个字符串数组转换为一个Map
,其中键为该元素的值,值为该元素的索引。这个步骤是为了后面方便根据值来查找索引。
接着,从第一个Map
中取出第一个键值对,将它们分别作为sum
和type
的初始值。如果有多个Map
,则遍历每个Map
,每次比较当前Map
中第一个键值对的索引和前一个Map
中最后一个键值对的索引是否相等。如果相等,则将当前Map
中第二个键值对的值加到sum
中,并将当前键值对的索引作为type
的新值;否则,将当前键值对的值加到sum
中,并将当前键值对的索引作为type
的新值。
最后输出sum
即为所求。
试题来源:华为 OD 联盟整理收集
题解:解题思路 与 代码 为原创内容,该部分版权由 OD 联盟共同拥有,并授权组内成员发布。
目标:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。