题目描述
N 位同学站成一排,音乐老师要请其中的 (N−K) 位同学出列,使得剩下的 K 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1,2,⋯K,他们的身高分别为 T1,T2,⋯,TK, 则他们的身高满足 T1<⋯<Ti>Ti+1>⋯>TK(1≤i≤K)。
你的任务是,已知所有 N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入描述
输入两行。
第一行是一个整数 N (2≤N≤100),表示同学的总数。
第二行有 n 个整数,用空格分隔,第 i 个整数 Ti(130≤Ti≤230) 是第 i 位同学的身高(厘米)。
输出描述
输出一个整数,就是最少需要几位同学出列。
输入输出样例
示例 1
输入
8
186 186 150 200 160 130 197 220
输出
4
运行限制
最大运行时间:1s
最大运行内存: 128M
源码:
import java.util.Scanner;
public class 合唱队形 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int[] a=new int[n];
for (int i = 0; i < a.length; i++) {
a[i]=scanner.nextInt();
}
int[] left=new int[n];
int[] right=new int[n];
int[] num=new int[n];
for (int i = 0; i < n; i++) {
left[i]=1;
for (int j = 0; j < i; j++) {
if (a[i]>a[j]) {
left[i]=Math.max(left[i], left[j]+1);
}
}
}
for (int i = n-1; i >=0; i--) {
right[i]=1;
for (int j = n-1; j > i; j--) {
if (a[i]>a[j]) {
right[i]=Math.max(right[i], right[j]+1);
}
}
}
for (int i = 0; i < num.length; i++) {
num[i]=left[i]+right[i]-1;
}
int res=-1;
for (int i = 0; i < num.length; i++) {
res=Math.max(res, num[i]);
}
System.out.println(n-res);
}
}