题目描述
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,
则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入
输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。
第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。
可能包括多组测试数据,当输入的 N=0 时表示输入结束
输出
对于每组数据,输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
样例输入 Copy
3 174 208 219 6 145 206 193 171 187 167 0
样例输出 Copy
0 1
#include<bits/stdc++.h>
using namespace std;
int a[200],b[200],c[200];
int main(){
int n,i,j,maxx;
while(true){
cin>>n;
if(n==0){
return 0;
}
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
cin>>a[i];
}
for(i=1;i<=n;i++){
b[i]=1;
for(j=1;j<=i-1;j++){
if((a[i]>a[j]) && (b[j]+1>b[i])){
b[i]=b[j]+1;
}
}
}
for(i=n;i>=1;i--){
c[i]=1;
for(j=i+1;j<=n;j++){
if((a[j]<a[i]) && (c[j]+1>c[i])){
c[i]=c[j]+1;
}
}
}
maxx=0;
for(i=1;i<=n;i++){
if(b[i]+c[i]>maxx){
maxx=b[i]+c[i];
}
}
cout<<n-maxx+1<<endl;
}
}