描述
注意
不允许改变队列元素的先后顺序 且 不要求最高同学左右人数必须相等
输入描述
用例两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开。
输出描述
最少需要几位同学出列
示例
输入
8
186 186 150 200 160 130 197 200
输出
4
JavaScript代码
let n;
while (n = readline()) {
n = parseInt(n);
let str = readline().split(' ').map(i => parseInt(i));
let list1 = func(str);//左边升序 最长的
let list2 = func(str.reverse()).reverse();//右边降序最长的
let list3 = list1.map((i, idx) => i + list2[idx]);
let max = 0;
list3.forEach((i, index) => {
if (index !== 0 && index !== list3.length-1) {
//不取首位 不取构不成左升右降的
if (max < i&&list1[index]!=1&&list2[index]!=1) {
max = i;
}
}
});
//左升右降中包含了同一个.所以合唱队形人数为max-1
//要出列的人数 则为(n-(max-1))
console.log(n-(max-1));
}
function func(str) {
const list = [];
for (let i = 0, l = str.length; i < l; i++) {
list[i] = 1;//默认都为 1
for (let j = 0; j <= i; j++) {
//从0开始 到 该i
if ( str[j] < str[i]) {//满足左边升序的可能
list[i] = Math.max(list[i], list[j] + 1);//选择最佳的
}
}
}
return list;
}