目录
题目描述
输入描述
输出描述
用例
题目解析
算法源码
微商模式比较典型,下级每赚 100 元就要上交 15 元,给出每个级别的收入,求出金字塔尖上的人收入。
比如:
(代理商代号) (上级代理商代号) (代理商赚的钱)
1 0 223
2 0 323
3 2 1203
0(金字塔顶代理商)
105 (最终的钱数)
解释:
2的最终收入等于323 + 1203/100*15=323 + 180
0的最终收入等于(323 + 180 + 223)/ 100 * 15 = 105
输入 | 1 0 223 2 0 323 3 2 1203 |
输出 | 0 105 |
说明 | 无 |
这道题看上去平平无奇,但是实际操作起来却有点无从下口。
首先,从用例来看,上下级关系,不是连续,比如2的上级不是1,而是0。
因此,我们需要用到输入中的上下级关系。
我的解题思路如下:
将每行输入转为一个数组,数组包含三个要素:[本级id,上级id,本级收入],这样就会得到一个二维数组。
然后对二维数组排序,按照上级id进行降序(因为0是最高级)。
定义一个agent数组,agent[i]代表第i级的收入。
遍历二维数组,根据遍历得到的一维数组:[本级id,上级id,本级收入]
可以得到 agent[上级id] += 本级收入 / 100 * 15,
但是此时 agent[上级id] 可能并未初始化,因此我们需要判断是否需要初始化。
另外,我们还需要注意,遍历到第二个一维数组时,agent[本级id]可能有了下级上交的收入,因此:本级收入 += agent[本级id],当然前提是agent[本级id]有值。
最终我们就可以通过agent[0]获取到金字塔顶级代理的收入了。
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {if (line === "") {const arr = lines.map((line) => line.split(" ").map(Number));console.log(0)console.log(getResult(arr));lines.length = 0;} else {lines.push(line);}
});function getResult(arr) {const agent = {};arr.sort((a, b) => b[1] - a[1]).forEach((ele) => {let [id, preId, money] = ele;if (agent[id]) money += agent[id];if (!agent[preId]) agent[preId] = 0;agent[preId] += Math.floor(money / 100) * 15;});return agent[0];
}
下一篇:JS --引用数据类型