华为机试_HJ24 合唱队【中等】【收藏】

news2025/2/2 4:36:50

 

目录

描述

输入描述:

输出描述:

解题过程

提交代码

学习代码

代码一

代码二

收藏点


描述

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-2
        max=-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);
}

收藏点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想学Redis却不会安装,这有一个快速入门请拿去

一. Redis简介 1.什么是Redis Redis是一个完全开源免费、且遵守BSD协议的&#xff0c;高性能(NOSQL)的key-value数据库。Redis本身使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型&#xff0c;并提供多种语言的API。 2.Redis特点 Redis具有如下特点&#xff1…

DJ13-2 汇编语言程序设计

目录 一、顺序程序设计 二、分支程序设计 1. 用比较/测试命令条件转移指令实现分支 2. 采用跳转表实现多路分支 三、循环程序设计 1. 计数循环程序设计 2. 条件判断循环程序设计 四、子程序设计 1. 子程序设计举例 2. 主程序和子程序设计举例 一、顺序程序设计 举例…

低代码为什么会受到企业青睐?是何原因?

低代码为什么会受到企业青睐&#xff1f;是何原因&#xff1f;回答这个问题&#xff0c;只需用4个“更”字&#xff0c;就能很好的概括。 1、更快&#xff08;开箱即用&#xff09; 2、更省&#xff08;人力、时间成本&#xff09; 3、更合适&#xff08;需求贴合业务&#…

mfc常用控件

mfc在编写桌面客户端应用应用程序&#xff0c;在设计界面时&#xff0c;如果像一般的界面&#xff0c;实施人员或者适配人员使用(特定的用户群体)对界面要求没有那么高&#xff0c;只要软件功能正常&#xff0c;稳定就行&#xff0c;我们在做这些界面时&#xff0c;通常使用原生…

CSDN第16期竞赛

目录 1.比赛详情 2.竞赛感悟 3.竞赛题目回顾 &#xff08;1&#xff09;鬼画符门莲台争夺战 (2)津津的储蓄计划 &#xff08;3&#xff09;多边形的面积 (4)小桥流水人家 1.比赛详情 比赛地址&#xff1a;http://t.csdn.cn/b1Lzm 2.竞赛感悟 通过这次的周赛&#xff0c…

SQLserver技巧 年份判断,以及向上想下取整

SELECT [出厂日期],DATEDIFF(month,出厂日期,getdate())*1.0/12 as 使用年限/年 ---------得到的结果实际&#xff08;浮点&#xff09;,cast(DATEDIFF(month,出厂日期,getdate())*1.0/12 as decimal(18,1)) as 使用年限/年 FROM tableA参考&#xff1a; https://blog.csdn.…

这篇文章来告诉你几个实用的视频转文字的方法

相信大家在闲暇之余&#xff0c;都会通过一些网课来提高自己的知识本领吧&#xff01;有的时候在上网课的过程中&#xff0c;会感觉自己做笔记的速度赶不上老师的进度&#xff0c;重复观看又比较麻烦&#xff0c;这时我们就可以借助一些视频转换软件来将视频转换成文字&#xf…

元宇宙产业委共同主席倪健中:发挥元宇宙总部基地优势,探索农业元宇宙发展之路|2022首届海南自贸港(临高)乡村振兴发展论坛

12月12日&#xff0c;2022首届海南自贸港&#xff08;临高&#xff09;乡村振兴发展论坛暨经济合作洽谈周活动在临高开幕。此次活动以“精彩新临高抢滩自贸港”为主题&#xff0c;重点推介“红色”文旅、“黄色”农业、“蓝色”海洋、“绿色”金牌港和“紫色”数字经济组成的五…

【c++提高1】二叉树二叉堆(万字总结)

大纲 一、二叉树 二叉树&#xff1a;1.二叉树简介 二叉树&#xff1a;2.二叉树的性质 二叉树&#xff1a;3.二叉树的存储 二叉树&#xff1a;4.二叉树的遍历 二叉树&#xff1a;5.求解先序、后序、层次遍历序列 二叉树&#xff1a;6.例题 二、二叉堆 二叉堆&#xff1a;1.二叉堆…

Windows下NCNN环境配置(VS2019)

Windows下NCNN环境配置&#xff08;VS2019&#xff09; 本文修改自&#xff1a;Windows下ncnn环境配置&#xff08;VS2019&#xff09; 一、下载VS2019并安装 1、下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 2、下载后安装工作负载&#xff08;安装以…

答疑解惑:开发者必须了解的Unicode和字符编码系统

目录 前言 ASCII Unicode UTF-8 C#中的字符串类型 UTF-16 String.Length 返回的是字符个数吗&#xff1f; 问题与答案 总结 参考 前言 请大家先思考几个问题 为什么有时候页面文本全是“锟斤拷”等乱码&#xff0c;有时候是个别字符别被替换为了&#xfffd;呢&a…

2.fs文件系统模块

fs模块是Node.js官方提供的用于操作文件的模块 目录 1 导入fs模块 2 读取文件内容 fs.readFile() 2.1 读取成功 2.2 读取失败 2.3 搞个函数判定读取成功还是失败 3 写入文件内容 fs.writeFile() 3.1 写入成功 3.2 写入失败 3.3 搞个函数判定写入成功还是失败…

如何构建企业内的 TiDB 自运维体系

1. 前言 得物 App 从创立之初&#xff0c;关系型数据库一直使用的开源数据库产品 MySQL。和绝大部分互联网公司一样&#xff0c;随着业务高速增长、数据量逐步增多&#xff0c;单实例、单库、单表出现性能瓶颈和存储瓶颈。从选型和架构设计角度来看这很符合发展规律&#xff0…

[思维模式-8]:《如何系统思考》-4- 认识篇 - 什么是系统思考?系统思考的特征?系统思考的思维转变。

目录 第1章 系统思考概述 1.1 什么是系统思考 1.2 系统思考适合解决什么样的问题&#xff1f;解决复杂问题的有效利器&#xff01; 1.3 思维模式的转换&#xff1a;还原论向整体论&#xff08;西医向中医&#xff09; 第2章 系统思考的四项特征 2.1 看到全貌而非局部 2.…

ubuntu18.04+pycharm+pydesigner 配置教程(亲测可用)

文章目录系统环境pytorch 环境安装依赖包安装qtdesignerPyUICpycharm配置qtdesigner配置PyUIC配置成功如何使用参考文章&#xff1a;系统环境 ubuntu18.04 OS: Ubuntu 18.04.6 LTS Python version: 3.7 (64-bit runtime) Is CUDA available: True CUDA runtime version: 11.1…

物联网通信原理第4章 中远距离无线通信技术

目录 4.1 无线局域网&#xff08;WLAN, Wireless LAN&#xff09; 4.1.7 IEEE 802.11标准中的MAC子层&#xff08;掌握&#xff09; 1. IEEE 802.11 MAC帧格式 2. MAC层工作原理&#xff08;本章重点&#xff09; 4.4 无线局域网的扩频传输技术 4.4.1 直接序列扩频&#x…

使用inputmode改变移动端键盘弹出的类型

文章目录前言一、inputmode是什么&#xff1f;二、它有那些属性2.1 none2.2 text(默认值)2.3 numeric2.4 decimal2.5 tel2.6 search2.7 email2.8 url三、需要注意四、兼容前言 使用原因&#xff1a;需求是同时兼容移动端和PC端的输入&#xff0c;输入框数量多且绑定不同的对象…

深度学习Week11-调用官方权重进行检测(YOLOv5)

前言&#xff1a; 很早之前&#xff0c;我发过小白YOLOv5全流程-训练实现数字识别_牛大了2022的博客-CSDN博客_yolov5数字识别这篇文章&#xff0c;里面用简练语言分享用yolov5训练自己的识别器&#xff0c;但包括我在内许多人仍不了解其运行原理&#xff1b;过去两周&#xff…

Java并发——synchronized关键字

Java并发——synchronized关键字 1.synchronized作用的范围 synchronized有两种作用范围&#xff1a;对象锁和类锁 对象锁 使用方式&#xff1a; 在普通方法上加synchronized&#xff08;默认锁对象为this&#xff09;和同步代码块&#xff08;自己指定锁对象&#xff09; …

2022全年度净水器十大热门品牌销量榜单

随着人们健康意识的提升&#xff0c;每天喝足量水的观念已经深入人心&#xff0c;而伴随居民生活水平的提高&#xff0c;当下居民对水污染问题也更加关注&#xff0c;对饮水品质的认知和要求也随之升级。因此&#xff0c;净水器在过去几年开启了高速增长的趋势。 根据鲸参谋数据…