Javascript 合唱队
说明:
N 位同学站成一排,音乐老师要请其中的 (N - K) 位同学出列,使得剩下的 K 位同学排成合唱队形。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。合唱队形即身高从左往右递增,然后递减,只有一个高峰。
输入描述:
有多组用例,每组都包含两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开
输出描述:
最少需要几位同学出列
--------------------------------------------------个人笔记-------------------------------------------------
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const arr = [];
rl.on('line', function (line) {
if (line === "") {
rl.close();
} else {
arr.push(line);
}
});
rl.on("close", function() {
const heightStrArr = arr.filter((item, index) => index % 2 === 1);
heightStrArr.forEach(item => {
const heightArr = item.split(" ").map(Number);
const len = heightArr.length;
const leftSerial = [];
const rightSerial = [];
const stuNumberArr = [];
// 从左往右序列化
for(let i = 0; i < len; i++) {
leftSerial[i] = 1; // 是否作为队形的起点 1
for(let j = 0; j < i; j++) {
// 如果高于左边的其他人,符合队形的从左往右最多排到第几
if (heightArr[i] > heightArr[j]) {
leftSerial[i] = Math.max(leftSerial[j] + 1, leftSerial[i]);
}
}
}
// 从右往左序列化
for(let i = len - 1; i >= 0; i--) {
rightSerial[i] = 1;
for(let j = len - 1; j > i; j--) {
if (heightArr[i] > heightArr[j]) {
rightSerial[i] = Math.max(rightSerial[j] + 1, rightSerial[i]);
}
}
}
// 排成合唱队形的同学人数
for(let i = 0; i < len; i++) {
stuNumberArr[i] = leftSerial[i] + rightSerial[i] - 1;
}
// 最多人数的合唱队和最少需要几位同学出列
const maxNumber = Math.max(...stuNumberArr);
const minOffNumber = len - maxNumber;
console.log(minOffNumber);
});
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~