码迷,mamicode.com
首页 > 其他好文 > 详细

2015华为机试——合唱队

时间:2015-07-17 12:08:11      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:2015华为机试   java   算法   math   动态规划   

描述:
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
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];
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

2015华为机试——合唱队

标签:2015华为机试   java   算法   math   动态规划   

原文地址:http://blog.csdn.net/zzc8265020/article/details/46923873

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!