描述:
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得Ti<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
题目类别: 循环
难度: 初级
运行时间限制: 无限制
内存限制: 无限制
阶段: 入职前练习
输入:
整数N
一行整数,空格隔开,N位同学身高
输出:
最少需要几位同学出列
样例输入:
8
186 186 150 200 160 130 197 200
样例输出:
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得Ti<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
题目类别: 循环
难度: 初级
运行时间限制: 无限制
内存限制: 无限制
阶段: 入职前练习
输入:
整数N
一行整数,空格隔开,N位同学身高
输出:
最少需要几位同学出列
样例输入:
8
186 186 150 200 160 130 197 200
样例输出:
4
代码如下:
public class he_ChangDui
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
//n为人数
int n=sc.nextInt();
int[] height=new int[n];
for (int i = 0; i < n; i++)
{
height[i]=sc.nextInt();
}
int[] temp=new int[n];
for (int i = 0; i < n; i++)
{
int []a=new int[i];
for (int j = 0; j < i; j++)
{
a[j]=height[j];
}
int[] b=new int[height.length-i];
for (int k = i; k < height.length; k++)
{
b[k-i]=height[height.length-k+i-1];
}
temp[i]=handle(a)+handle(b);
}
Arrays.sort(temp);
System.out.println(n-temp[n-1]);
sc.close();
}
public static int handle(int[] num)
{
if (num.length==0)
{
return 0;
}
int[] curMax=new int[num.length];
for (int i = 0; i < num.length; i++)
{
curMax[i]=1;
for (int j = 0; j < i; j++)
{
if (num[i]>num[j]&&curMax[i]<curMax[j]+1)
{
curMax[i]=curMax[j]+1;
}
}
}
Arrays.sort(curMax);
return curMax[num.length-1];
}
}