思路:
1、查找每一个数的左边的最大递增子字符串长度,放入数组incNum中。
2、查找每个数的右边最大递增子字符串长度,放入数组decNum中
3、两者相加,减去重复计算的1,即为将此数放中间组成合唱队所需要的人数,取最大值max
4、总人数减去第三步所得,就可以得出需要出列的最少人数
注意:身高是递增的,不能等于
这道题看很久了,一直不得其解,看了讨论里一楼的思路,和一楼下面的讨论和回复,才恍然大悟,总结成c语言如下
#include<stdio.h>
int main(void){
int n;
while(scanf("%d",&n)!=EOF){
int queue[n],incNum[n],decNum[n],max=0;
for(int i = 0; i< n;i++){
scanf("%d",&queue[i]);
incNum[i] = 1;
decNum[i] = 1;
//在这个循环里查出左边的递增字串数
if(i > 0){
for(int j = i-1;j>=0;j--){
if(queue[j] < queue[i] && incNum[i] < incNum[j] + 1)
incNum[i] = incNum[j] + 1;
}
}
}
//计算右边的递增字串,并计算max
for(int i = n-1;i>=0;i--){
if(i < n-1){
for(int j=i+1;j<n;j++){
if(queue[j] < queue[i] && decNum[i] < decNum[j] + 1)
decNum[i] = decNum[j]+1;
}
}
//计算最大的max
max = decNum[i] + incNum[i] > max?decNum[i] + incNum[i]:max;
}
//需要出列的人数为,总人数减max,再减去重复多计算自己的一次
max = n-(max-1);
printf("%d\n",max);
}
return 0;
}
京公网安备 11010502036488号