目录

描述

输入描述:

输出描述:

解题过程

提交代码

学习代码

代码一

代码二

收藏点


描述

N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。

设KK位同学从左到右依次编号为 1,2…,K ,他们的身高分别为T_1,T_2,…,T_KT1​,T2​,…,TK​ ,若存在i(1\leq i\leq K)i(1≤i≤K) 使得T_1<T_2<......<T_{i-1}<T_iT1​<T2​<......<Ti−1​<Ti​ 且 T_i>T_{i+1}>......>T_KTi​>Ti+1​>......>TK​,则称这KK名同学排成了合唱队形。

通俗来说,能找到一个同学,他的两边的同学身高都依次严格降低的队形就是合唱队形。

例子:

123 124 125 123 121 是一个合唱队形

123 123 124 122不是合唱队形,因为前两名同学身高相等,不符合要求

123 122 121 122不是合唱队形,因为找不到一个同学,他的两侧同学身高递减。

你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

注意:不允许改变队列元素的先后顺序  不要求最高同学左右人数必须相等

数据范围: 1≤n≤3000

输入描述:

用例两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开

输出描述:

最少需要几位同学出列

解题过程

提交代码

学习代码

代码一

(作者:https://www.nowcoder.com/users/974547592)

动态规划,时间复杂度O(n^2)

#include <stdio.h>
#include <string.h>int main(){int N;scanf("%d",&N);int a[N];int max;for(int i=0;i<N;i++){scanf("%d",&a[i]);}//逆序遍历,以当前元素为基准,记录其右边的最大严格递减序列的元素个数int dp_r[N];memset(dp_r,0,sizeof(dp_r));//将这一块内存清零//dp_r[x]指的是,在a[x]这个元素右边,比a[x]小的元素有几个for(int i=N-2;i>-1;i--){//因为要记录的是右边最大严格递减序列的元素个数,所以i的初始值是N-2max=-1;for(int j=i+1;j<N;j++){if(a[i]>a[j] && dp_r[j]>max){//max记录的是 最多的严格递减的个数max=dp_r[j];dp_r[i]=dp_r[j]+1;}}}//顺序遍历,以当前元素为基准,记录其左边的最大严格递增序列的元素个数int dp_l[N];memset(dp_l,0,sizeof(dp_l));for(int i=1;i<N;i++){max=-1;for(int j=i-1;j>-1;j--){if(a[i]>a[j] && dp_l[j]>max){max=dp_l[j];dp_l[i]=dp_l[j]+1;}}}//遍历整个数组,计算当前元素dp_r[i]+dp_l[i]的大小,计算最大值for(int i=0;i<N;i++){if(dp_r[i]+dp_l[i]>max){max=dp_r[i]+dp_l[i];}}printf("%d",N-max-1);
}

代码二

(作者:https://www.nowcoder.com/users/974547592)

建立辅助数组,维持辅助数组元素有序排列,用二分查找找到原数组元素在该辅助数组中该插入的位置,该位置即为动态规划中dp[i]的值,时间复杂度O(nlogn)

#include <stdio.h>
#include <string.h>int search(int* a,int key,int high){//二分查找int low=0,mid;while(low<=high){mid=(low+high)/2;if(a[mid]==key){return mid;}else if(a[mid]>key){high=mid-1;}else{low=mid+1;}}if(a[mid]>key){return mid;}else{return mid+1;}
}int main(){int N;scanf("%d",&N);int a[N];int b[N];memset(b,0,sizeof(b));//辅助数组for(int i=0;i<N;i++){scanf("%d",&a[i]);}int max=0;int p;//顺序遍历,以当前元素为基准,记录其左边的最大严格递增序列的元素个数int dp_l[N];dp_l[0]=0;b[max]=b[0]=a[0];for(int i=1;i<N;i++){if(a[i]<=b[0]){//原数组元素值超过辅助数组下界就替换dp_l[i]=0;b[0]=a[i];}else if(a[i]>b[max]){//原数组元素值超过辅助数组上界,将其插入后形成新的上界dp_l[i]=++max;b[max]=a[i];}else{//原数组元素值在中间就在辅助数组中查找刚好大于它的数并替换p=search(b,a[i],max);dp_l[i]=p;b[p]=a[i];}}max=0;//逆序遍历,以当前元素为基准,记录其右边的最大严格递减序列的元素个数int dp_r[N];dp_r[N-1]=0;memset(b,0,sizeof(b));b[max]=b[0]=a[N-1];for(int i=N-2;i>-1;i--){if(a[i]<=b[0]){//原数组元素值超过辅助数组下界就替换dp_r[i]=0;b[0]=a[i];}else if(a[i]>b[max]){//原数组元素值超过辅助数组上界,将其插入后形成新的上界dp_r[i]=++max;b[max]=a[i];}else{//原数组元素值在中间就在辅助数组中查找刚好大于它的数并替换p=search(b,a[i],max);dp_r[i]=p;b[p]=a[i];}}    //遍历整个数组,计算当前元素dp_r[i]+dp_l[i]的大小,计算最大值for(int i=0;i<N;i++){if(dp_r[i]+dp_l[i]>max){max=dp_r[i]+dp_l[i];}}printf("%d",N-max-1);
}

收藏点

华为机试_HJ24 合唱队【中等】【收藏】相关推荐

  1. (python)牛客网(华为机试四)——较难

    本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化. 其他题解合集: (python)牛客网(华为机试一)--入门 (python)牛客网(华为机试二)--简单 (p ...

  2. 牛客在线编程-华为机试-中等

    牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...

  3. 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...

  4. 【华为机试真题Java】从入门到入职-真题列表导读

    写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...

  5. 【华为机试真题JavaScript】字符串分割

    目录 题目描述 输入描述 输出描述 参考示例 参考代码 机试介绍 写在最后 题目描述 给定一个非空字符串S,其被N个'-'分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成 ...

  6. 华为机试108题(C 语言解答)

    Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...

  7. 【华为机试真题详解】数大雁【2022 Q2 | 100分】

    文章目录 前言 详解试题 1419. 数青蛙 华为机试题. 数大雁 题目解析 数青蛙代码实现 数大雁不考虑叫声不完整的情况 数大雁考虑叫声不完整的情况 前言 <华为机试真题详解>专栏含牛客 ...

  8. 牛客网华为机试(python)

    前言 牛客网华为机试(https://www.nowcoder.com/exam/oj/ta?tpId=37) 按难度分为入门,简单,中等,困难,较难五个等级 目录标题 前言 一,入门 二,简单 一, ...

  9. 【华为机试真题 Python实现】2023年1、2月高频机试题

    文章目录 2023年1季度最新机试题 机考注意事项 1. 建议提前刷题 2. 关于考试设备 3. 关于语言环境 3.1. 编译器信息 3.2. ACM 模式 使用sys 使用input(推荐) 3. ...

最新文章

  1. adb devices只显示List of devices attached
  2. win7下搭建nginx+php的开发环境
  3. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测
  4. AI理论知识基础(25)-机器学习常见损失函数, 共轭梯度法(1)
  5. 排序算法有哪些_超强整理,科班算法岗的秋招之路
  6. TransH:将知识嵌入到超平面(知识图谱嵌入)2014 AAAI
  7. c++ post请求_Golang GinWeb框架5绑定请求字符串/URI/请求头/复选框/表单类型
  8. PC 平台上的一种快速 Red Hat Linux 安装方法
  9. 手机软件Toast无法显示提示信息
  10. matlab sort函数
  11. 文件服务器资源管理器类似软件,好用的小众文件管理软件推荐给大家
  12. 台大Machine Learning 2017Fall HW0字数统计和图片淡化 解答
  13. XTU 1205 Range
  14. 使用n2disk和PF_RING构建一个(便宜的)2×10 Gbit(连续)数据包记录器
  15. python图表导入word_使用python matplotlib 画图导入到word中如何保证分辨率
  16. PHP 使用用户排队机制解决网站大访问量的例子
  17. 局域网中工作组和域之间的区别
  18. 到底要不要在office/wps平台上做开发
  19. 解读《领域驱动设计 软件核心复杂性应对之道》(一)
  20. python 文件和文件夹操作

热门文章

  1. PTA---航空公司VIP客户查询 (25分)---Stl-Map容器简单使用
  2. 数据可视化之小提琴图(原理+Python代码)
  3. iptv增值业务--华为机顶盒视频播放代码
  4. 人工神经网络与神经网络,带反馈的人工神经网络
  5. 支持Apple Music无损音频的耳机型号以及iPhone、iPad
  6. PX4中的二阶巴特沃斯低通滤波
  7. 汇编语言:使用汇编程序计算2的8次方
  8. MySQl排序,别名
  9. python用*号输出字母c的图案_第1.6题:使用Python生成字母验证码图片
  10. Go语言实现获取有道网页结果