题解 | #合唱队#

合唱队

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-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
我是小红是我:学校换成中南
点赞 评论 收藏
分享
8 2 评论
分享
牛客网
牛客企业服务