1、组织架构管理系统 你正在开发一个企业的组织架构管理系统,公司的组织架构被简化表示为一棵二叉树,树的每个节点代表一个员工,树的层级越低则级别越高,高级别作为主管,管辖其子树涉及的所有员工. 每个人有一个唯一的工号,工号以整数值表示,范围是[0,10^9]。 此管理系统需要提供一个统计能力、对任意两名员工,找到他们级别最低的共同主管,返回出的主管管辖的人员个数。 注意: 如果两名员工本身存在上下级关系,共同主管为级别较高的员工。 员工总数<=10^5。 待检索员工的工号一定在给定的二叉树中,且两位员工工号不同。 解答要求 时间限制:C/C++200ms,其他语言:400ms 内存限制:C/C++256MB,其他语言:512MB 输入 第一行为一个整数,表示输入的节点个数。 第二行为一行数字,由空格分割,每个数字表示一颗满二叉树各层从左到右的节点。值为员工工号,-1代表该节点不存在。 例1 2 3 4 -1 5 -1 -1 6可转化为下图的二叉树。 第三行为两个数字,用空格分割,表示待检索的两名员工工号,例如:5 1。 输出 输出级别最低的共同主管管辖的人员总个(不包括自身)。 样例1 复制 输入:12 2 3 5 1 7 6 8 -1 -1 0 4 -1 0 3 复制 输出:4 解释:0和3存在上下级关系,共同主管为3,管辖总人数为4。 样例2 复制输入:9
function TreeNode(val=0, left=null, right=null) {
this.val = val;
this.left = left
this.right = right
}
const rl = require('readline').createInterface({
input: process.stdin,
})
const iter = rl[Symbol.asyncIterator]()
const readline = async () => (await iter.next()).value
async function main () {
let num = await readline()
let arr = (await readline()).split(' ').map(Number)
let [p1, p2] = (await readline()).split(" ").map(Number);
const root = buildTree(arr)
const commonNode = findCommonNode(root, p1, p2)
console.log(countNode(commonNode));
}
function countNode(root) {
let count = 0
function dfs(root) {
if(!root) return
count++
dfs(root.left);
dfs(root.right);
}
dfs(root);
return count
}
function findCommonNode(root, p1, p2) {
const p1Node = findNode(root, p1);
const p2Node = findNode(root, p2);
if(!p1Node || !p2Node) return null
function dfs(root, p, q) {
if(!root) return null
if(root === p || root === q) return root
const left = dfs(root.left, p, q)
const right = dfs(root.right, p, q);
if (left && right) return root;
return left || right
}
return dfs(root, p1Node, p2Node);
}
function findNode(root, val) {
if(!root) return null
if(root.val === val) return root
return findNode(root.left, val) || findNode(root.right, val);
}
function buildTree(arr) {
if (!arr.length) return null
let root = new TreeNode(arr[0])
let queue = [root]
let i = 1
while(i < arr.length) {
const node = queue.shift()
if(node) {
if(arr[i] !== -1) {
node.left = new TreeNode(arr[i])
queue.push(node.left)
}
i++
if(arr[i] !== -1) {
node.right = new TreeNode(arr[i])
queue.push(node.right)
}
i++
}
}
return root;
}
main()
// 12
// 2 3 5 1 7 6 8 -1 -1 0 4 -1 0 3
//0 3
2、奖项设置 部门准备了一批奖品用于举办抽奖活动,奖品的价值为给定的正整数数组values,其中values[i]表示第i个奖品的价值。每位获奖者可以选择不 限个数最大价值limit的奖品组合,获奖者选择奖品的策略为在limit限制内优先选择单价最高的奖品,请计算最少可以设置多少个奖项; 解答要求 时间限制:c/C++1000ms,其他语言:2000ms 内存限制:C/C++256MB,其他语言:512MB 输入 第一行:正整数len,表述奖品价值数组values的长度, 1<=len<=10^4; 第二行:正整数数组values,长度为len,其中values[i]表示第i个奖品的价值,1<=values[]<=10^4; 第三行:正整数limit,表示每个获奖者可以获得的最大奖品价值, 1<=limit<=10^4。 输出 整数,代表本次抽奖活动可以设置最少的奖项数量; 样例1 复制 输入:2 1 2 3 复制 输出:1 解释:获奖者选择价值为1和2的两个奖品,最少可以设置1个奖项 样例2 复制 输入:7 13 4 4 3 3 5 5 12 复制输出:3 解释:获奖者1选取价值为(5,5)的奖品组合,获奖者2选取价值为(4,4,3)、3的奖品组合,因此:最少可以设置3个奖项才能满足所有获奖者的领取诉求
const rl = require('readline').createInterface({
input: process.stdin,
output: process.stdout
})
const iter = rl[Symbol.asyncIterator]()
let readline = async () => (await iter.next()).value.trim()
const main = async () => {
const len = parseInt(await readline())
const values = (await readline()).split(' ').map(Number)
const limit = parseInt(await readline())
// 按价值从大到小排序
values.sort((a, b) => b - a)
const awards = [] // 每个奖项当前的价值和
for (let v of values) {
let placed = false
for (let i = 0; i < awards.length; i++) {
if (awards[i] + v <= limit) {
awards[i] += v
placed = true
break
}
}
if (!placed) {
awards.push(v) // 新开一个奖项
}
}
console.log(awards.length)
}
main()