Problem Description
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1≤i≤K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
Input
输入的第一行为T,表示测试数据的组数。对于每组测试数据的第一行是一个整数N(2 ≤ N ≤ 100),表示同学的总数。第二行有n个整数,用空格分隔,第i个整数Ti(130 ≤ Ti ≤ 230)是第i位同学的身高(厘米)。
Output
对于每组测试数据,输出一行只包含一个整数,就是最少需要几位同学出列。
Sample Input
1 8 186 186 150 200 160 130 197 220
Sample Output
4
// 队形:T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1≤i≤K)。 #include<iostream> #include<string> using namespace std; struct td { int num; int f; int m; }a[205]; int main() { int n,t,i,j,max=0; cin>>t; while(t--) { cin>>n; for(i=0;i<n;i++) { cin>>a[i].num; a[i].m=a[i].f=1; } for(i=1;i<n;i++) // 上升序列 { max=0; for(j=0;j<i;j++) if(a[i].num>a[j].num&&a[j].f>max) max=a[j].f; a[i].f+=max; } for(i=n-2;i>=0;i--) // 下降序列 { max=0; for(j=n-1;j>i;j--) if(a[i].num>a[j].num&&a[j].m>max) max=a[j].m; a[i].m+=max; } max=0; for(i=0;i<n;i++) if((a[i].f+a[i].m)>max) max=a[i].f+a[i].m; cout<<n-max+1<<endl; } return 0; }