N位同学站成一列,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样一种队形,设K位同学从左到右依次编号为1、2、。。。,K,他们的身高分别为T1,T2,...,Tk,则他们的身高满足T1<...<Ti<Ti+1>...>TK(1<=i<=K).
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出文件】
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
合唱队形是指这样一种队形,设K位同学从左到右依次编号为1、2、。。。,K,他们的身高分别为T1,T2,...,Tk,则他们的身高满足T1<...<Ti<Ti+1>...>TK(1<=i<=K).
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出文件】
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
//求从左到右和从右到左每个点目前的最长不下降子序列,加起来求最大

1 //合唱队形 (同登山) 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 using namespace std; 6 const int maxx=101; 7 int a[maxx],b[maxx],c[maxx]; 8 int main() 9 { 10 int n; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 scanf("%d",&a[i]); 14 for(int i=1;i<=n;i++) 15 { 16 b[i]=1; 17 for(int j=1;j<=i-1;j++) 18 { 19 if(a[j]<a[i]&&b[i]<b[j]+1) 20 b[i]=b[j]+1; 21 } 22 } 23 for(int i=n;i>=1;i--) 24 { 25 c[i]=1; 26 for(int j=i+1;j<=n;j++) 27 { 28 if(a[j]<a[i]&&c[i]<c[j]+1) 29 c[i]=c[j]+1; 30 } 31 } 32 int maxl=0; 33 for(int i=1;i<=n;i++) 34 if(c[i]+b[i]>maxl) 35 maxl=c[i]+b[i]; 36 printf("%d",n-maxl+1); 37 return 0; 38 }