2529: Chorus
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
![]() | 1s | 16384K | 436 | 122 | Standard |
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...Ti+1>…>TK(1<=i<=K)。 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
Input
每组数据的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
Output
每组数据包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
Sample Input
8 186 186 150 200 160 130 197 220
Sample Output
4
Problem Source: noip
This problem is used for contest: 122 148
#include<stdio.h>
int main()
{
int num[110],up[110],down[110],n,i,j,max,min;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
for(i=2,up[1]=1;i<=n;i++)
{
up[i]=1;
for(j=1;j<i;j++)
{
if(num[j]<num[i]&&up[j]+1>up[i])
up[i]=up[j]+1;
}
}
for(i=n-1,down[n]=1;i>=0;i--)
{ down[i]=1;
for(j=n;j>i;j--)
{
if(num[j]<num[i]&&down[j]+1>down[i])
down[i]=down[j]+1;
}
}
for(i=1;i<=n;i++)
printf("%d/n",down[i]);
printf("........../n");
for(i=1;i<=n;i++)
printf("%d/n",up[i]);
for(i=1,max=0;i<=n;i++)
if(up[i]+down[i]>max)
max=up[i]+down[i];
max--;//最长的合唱队形人数
min=n-max;//最少要去掉的人数
printf("%d/n",min);
}
return 0;
}
//11 186 186 150 200 105 230 326 160 130 197 220