说明:
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);
});
});