题解 | #合唱队#

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    let arr = [];
    while(line = await readline()){
        arr.push(line);
    }
    let n = parseInt(arr[0]);
    arr = arr[1].split(' ').map(a => parseInt(a));
	// 分别寻找 列表arr 中每一项 正序left 和 逆序right 递增的最大值
    let left = getMaxGrowList(arr);
    let right = getMaxGrowList(arr.reverse());
    right.reverse();
    let arrRes = [];
	// 合并正序和逆序递增最大值的结果,获得每一项为最高时,需要抽走的人数
    for(let i = 0; i < n; i++) {
        arrRes.push(n - right[i] - left[i] + 1);
    }
	// 获取最小抽走的人数就是答案
    console.log(Math.min(...arrRes));
}()

// 寻找从左到各项递增的最大值
var getMaxGrowList = function(arr = []) {
    let res = [];
    // 最左侧递增值是1
    res.push(1);
    for(let i = 1 ;i < arr.length; i++) {
        let maxCount = 1;
        for(let ii = 0; ii < i; ii++) {
            // 找到之前项目中,小于当前值的最大 count
            if(arr[ii] < arr[i]) {
                maxCount = Math.max(maxCount, res[ii] + 1);
            }
        }
        res.push(maxCount);
    }
    return res;
}

全部评论

相关推荐

牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务