c语言处理

合唱队

http://www.nowcoder.com/questionTerminal/6d9d69e3898f45169a441632b325c7b4

思路:
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;
}
全部评论

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
字节 飞书绩效团队 (n+2) * 15 + 1k * 12 + 1w
点赞 评论 收藏
分享
评论
8
4
分享
牛客网
牛客企业服务