华为机试_HJ24 合唱队【中等】【收藏】
目录
描述
输入描述:
输出描述:
解题过程
提交代码
学习代码
代码一
代码二
收藏点
描述
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 合唱队【中等】【收藏】相关推荐
- (python)牛客网(华为机试四)——较难
本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化. 其他题解合集: (python)牛客网(华为机试一)--入门 (python)牛客网(华为机试二)--简单 (p ...
- 牛客在线编程-华为机试-中等
牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...
- 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...
- 【华为机试真题Java】从入门到入职-真题列表导读
写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...
- 【华为机试真题JavaScript】字符串分割
目录 题目描述 输入描述 输出描述 参考示例 参考代码 机试介绍 写在最后 题目描述 给定一个非空字符串S,其被N个'-'分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成 ...
- 华为机试108题(C 语言解答)
Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...
- 【华为机试真题详解】数大雁【2022 Q2 | 100分】
文章目录 前言 详解试题 1419. 数青蛙 华为机试题. 数大雁 题目解析 数青蛙代码实现 数大雁不考虑叫声不完整的情况 数大雁考虑叫声不完整的情况 前言 <华为机试真题详解>专栏含牛客 ...
- 牛客网华为机试(python)
前言 牛客网华为机试(https://www.nowcoder.com/exam/oj/ta?tpId=37) 按难度分为入门,简单,中等,困难,较难五个等级 目录标题 前言 一,入门 二,简单 一, ...
- 【华为机试真题 Python实现】2023年1、2月高频机试题
文章目录 2023年1季度最新机试题 机考注意事项 1. 建议提前刷题 2. 关于考试设备 3. 关于语言环境 3.1. 编译器信息 3.2. ACM 模式 使用sys 使用input(推荐) 3. ...
最新文章
- adb devices只显示List of devices attached
- win7下搭建nginx+php的开发环境
- OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测
- AI理论知识基础(25)-机器学习常见损失函数, 共轭梯度法(1)
- 排序算法有哪些_超强整理,科班算法岗的秋招之路
- TransH:将知识嵌入到超平面(知识图谱嵌入)2014 AAAI
- c++ post请求_Golang GinWeb框架5绑定请求字符串/URI/请求头/复选框/表单类型
- PC 平台上的一种快速 Red Hat Linux 安装方法
- 手机软件Toast无法显示提示信息
- matlab sort函数
- 文件服务器资源管理器类似软件,好用的小众文件管理软件推荐给大家
- 台大Machine Learning 2017Fall HW0字数统计和图片淡化 解答
- XTU 1205 Range
- 使用n2disk和PF_RING构建一个(便宜的)2×10 Gbit(连续)数据包记录器
- python图表导入word_使用python matplotlib 画图导入到word中如何保证分辨率
- PHP 使用用户排队机制解决网站大访问量的例子
- 局域网中工作组和域之间的区别
- 到底要不要在office/wps平台上做开发
- 解读《领域驱动设计 软件核心复杂性应对之道》(一)
- python 文件和文件夹操作