题解 | #合唱队#

合唱队

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

1、计算出每个同学左边最多有几个人满足从左到右依次增大的序列要求 以自身为结尾,依次++循环比较. 2、计算出每个同学右边最多有几个人满足从右到左依次增大的序列要求 以自身为开头,依次--循环比较. 3、最后两个数组的值相加,再加1(自身)。判断最大值是真实的值。(其余值都不准),可以判断出最多有多少人可以组成合唱队

#include <stdio.h>

#define MAX(a,b) ((a>b)?(a):(b))

int main()
{
    int N = 0;
    scanf("%d", &N);
    int stu[N];    //保存学生身高
    int left[N];    //保存从左到右依次增大的系列个数
    int right[N];   //保存从右到左依次增大的系列个数
    memset(stu, 0, N*sizeof(int));
    memset(left, 0, N*sizeof(int));
    memset(right, 0, N*sizeof(int));
    
    for(int i = 0; i < N; i++)
    {
        scanf("%d", &stu[i]);
    }
    for(int i = 1; i < N; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(stu[i] > stu[j])
            {
                left[i] = MAX(left[i], left[j]+1);//符合条件后,应该递增。所以+1
            }
        }
    }
#if 0
    /* 打印从左到右依次增大的系列个数 */
    for(int i = 0; i < N; i++)
    {
       printf("left[%d] = [%d]\n", i, left[i]);
    }
#endif  
    for(int i = N-1; i >= 0; i--)
    {
        for(int j = N-1; j > i; j--)
        {
            if(stu[i] > stu[j])
            {
                right[i] = MAX(right[i], right[j]+1);//符合条件后,应该递增。所以+1
            }
        }
    }
#if 0
    /* 打印从右到左依次增大的系列个数 */
    for(int i = 0; i < N; i++)
    {
       printf("right[%d] = [%d]\n", i, right[i]);
    }
#endif
    int max = 0;
    for(int i = 0; i < N; i++)
    {
        max = MAX(max, right[i] + left[i]+1);    //要加上本身
    }
    int min = N - max;
    printf("%d\n", min);
    return 0;
}
全部评论

相关推荐

双非一本失业第二年:《机器视觉垃圾分类》
点赞 评论 收藏
分享
11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
8 2 评论
分享
牛客网
牛客企业服务