合唱队问题的求解——华为OJ题目

本文介绍了如何解决华为在线判题中的一道问题,即计算最少需要多少位同学出列,使得剩余同学能形成合唱队形。通过分析解题思路,提出从每一位同学出发,寻找最优解的策略。程序使用两个递归函数分别计算左右两侧的最少出队人数,并在主函数中遍历所有可能的分割点,最终输出最小出队人数。
摘要由CSDN通过智能技术生成

一、问题的描述

以下是原题目描述。要求计算最少出列多少位同学,使得剩下的同学排成合唱队形

说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得Ti<T2<......<Ti-1<Ti>Ti+1>......>TK。 
     你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。 

二、解题思路分析

        由于给定的序列是任意的,因此每一个同学都可能是出队的同学。观察结果要求,第i位同学比较特殊,是左右两边的分割点。因此思路就从第i位同学开始,依次假定每一位同学是第i个同学的情况下,寻找该种情况下的最少出队同学人数。等每个同学均作为第i个同学搜索后,所得到的出队最少人数会不断更新,最终得到最优结果。

        上面的分析解决了整体上的解题思路,接下来为了得到在固定i同学情况下,如何求最少出队序列。应该分两边来考虑,左边的最少出队人数和右边的最少出队人数,加起来的和即为总共最少出队人数。分析,对于i左边的同学,应该均比右边的同学低,因此如果符合比右边同学低的人可以保留下来,但是如果高于右边的同学就必须出队。但有一种情况比较容易忽视,即低于右边人的同学也可能出队,因为有可能他保留下来了,会导致他左边更多的人出队。

        对于i右边的同学,采用同样的思路来进行。因此可以采用两个递归函数求解,一个求解i左边的最少出队人数,一个求解i右边的最少出队人数。

三、程序源代码与说明

     在代码中设置了两个递归函数,分别对应上面分析的求解两边的最少出队人数,int digui1(int * a,int i,int p,int ch,int k)函数求解元素p左边的最少出队人数,ch记录当前以出队人数,int digui2(int * a,int

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值