游客 Signup | Login
中文 | En

1496 - 合唱队形

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。

合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,
则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

Input

输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。

第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。

Output

可能包括多组测试数据,对于每组数据,

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

Examples

Input

3
174 208 219 
6
145 206 193 171 187 167 
0

Output

0
1

Solution C

#include <stdio.h>

#define Max 100

int main ()
{
	int n,nu[Max],dpu[Max],dpd[Max];
	while(scanf("%d",&n)!=EOF&&n)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d",&nu[i]);
			dpu[i]=dpd[i]=1;
		}
		for(int i=1;i<n;i++)
			for(int j=0;j<i;j++)
				if(nu[i]>nu[j]&&dpu[i]<dpu[j]+1)
					dpu[i]=dpu[j]+1;
		for(int i=n-2;i>-1;i--)
			for(int j=n-1;j>i;j--)
				if(nu[i]>nu[j]&&dpd[i]<dpd[j]+1)
					dpd[i]=dpd[j]+1;
		int max=0;
		for(int i=0;i<n;i++)
			if(max<dpu[i]+dpd[i])
				max=dpu[i]+dpd[i];
		printf("%d\n",n-(max-1));
	}
}

Solution C++

#include <stdio.h>
int n;
int run()
{
	int i,j,a[111],u[111],d[111];
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
		u[i]=1;
	for(i=1;i<=n;i++)
		d[i]=1;
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			if(a[i]<a[j])
				if(u[j]<u[i]+1)
					u[j]=u[i]+1;
			if(a[i]>a[j])
			{
				if(d[j]<u[i]+1)
					d[j]=u[i]+1;
				if(d[j]<d[i]+1)
					d[j]=d[i]+1;
			}
		}
	j=0;
	for(i=1;i<=n;i++)
		if(u[i]>j)
			j=u[i];
	for(i=1;i<=n;i++)
		if(d[i]>j)
			j=d[i];
	printf("%d\n",n-j);
}
int main()
{
	scanf("%d",&n);
	while(n!=0)
	{
		run();
		n=0;
		scanf("%d",&n);
	}
	return 0;
}
Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题