牛客网 华为机试 合唱队

2024-03-08 16:28
文章标签 牛客 华为 机试 合唱队

本文主要是介绍牛客网 华为机试 合唱队,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
本题抽象出来,我们需要找到最长递增子序列,还需要一个最长递减子序列,然后两个子序列的长度相加减去1就是我们这个合唱队的最大长度。然后我们用所有的人数减去合唱队最大长度,就是我们要求的最少需要几位同学出列。

这个题和上一题求最长递增子序列类似,只不过是又求了一个递减子序列,然后进行运算即可。

我们仍采用动态规划来解决。dp[i]表示包含nums[i]在内的最长递增子序列的长度。在本题中我们需要两个,以left和right区分。比如我们找到nums[i]此时left[i]+right[i]最大,就是表示以nums[i]为中心,其左右两侧满足递增递减并且整个序列长度最大。

先找到左侧的left最长递增子序列的长度。整个left[]应该初始化为1。因为最小递增子序列就是只包含其本身这个元素,所以是1。当nums[i]>nums[j]的时候(i>j),此时表示dp[i] = Math.max(dp[i],dp[j]+1)(dp就是left)。然后我们得到left数组。

同理,我们找递减的数组,right,如果我们从后往前遍历,就是在找递增的子序列,就和left的逻辑一致了。所以,我们从后往前遍历,并且right也都初始化为1。当nums[i]>numsj。此时满足递减的条件,所以right[i] = Math.max(right[i],right[j]+1)。

然后我们得到了right和left两个数组,此时我们要找到最大的合唱队长度,就是将right和left相加,找到结果最大的值(表示此时以nums[i]为中心,能够建立起最长的合唱队),但我们多加了一个i,因为right和left都包括了nums[i],所以我们要减去1才可以。

然后我们用整体的人数减去我们得到的最大值,就得到了我们要求的出列的最少人数。


import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}int[] left = new int[n]; //存储每个数左边小于其的数的个数int[] right = new int[n];//存储每个数右边小于其的数的个数left[0] = 1;            //最左边的数设为1right[n - 1] = 1;        //最右边的数设为1//计算每个位置左侧的最长递增for (int i = 0; i < n; i++) {left[i] = 1;for (int j = 0; j < i; j++) {if (arr[i] > arr[j]) {   //动态规划left[i] = Math.max(left[j] + 1, left[i]);}}}//计算每个位置右侧的最长递减for (int i = n - 1; i >= 0; i--) {right[i] = 1;for (int j = n - 1; j > i; j--) {if (arr[i] > arr[j]) {   //动态规划right[i] = Math.max(right[i], right[j] + 1);}}}// 记录每个位置的值int[] result = new int[n];for (int i = 0; i < n; i++) {//位置 i计算了两次 所以需要-1result[i] = left[i] + right[i] - 1; //两个都包含本身}//找到最大的满足要求的值int max = 1;for (int i = 0; i < n; i++) {max = Math.max(result[i],max);}System.out.println(n - max);}}
}

这篇关于牛客网 华为机试 合唱队的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/787680

相关文章

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。 给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为loca

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

华为 HCIP-Datacom H12-821 题库 (13)

有需要题库的可以看主页置顶 1.可以携带外部路由的 tag 标签信息的是以下哪一类 LSA? A、4 类 LSA B、5 类 LSA  C、3 类 LSA  D、2 类 LSA 答案:B 解析: 暂无解析 2..两台路由器直连,并设定网络类型为 p2p 建立OSPF 邻居。那么两台路由器传输 OSPF 报文的目的 IP 地址是以下哪一项? A、使用组播地址 224.0.0.6 B

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。 每个单元格可以有以下三种状态:  值 0 代表空地,无法传递信号;  值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔; 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms

实现的动态规划问题华为笔试题C++实现

秋招刷力扣题,我觉得我对动态规划不是熟练,在此处做总结 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。我觉得最大的问题就是对问题的分解,分解后的问题与分解前的问题具有相同的决策机制,将决策机制进行抽象,最终可以得到对应的解; 动态规划中开始介绍的爬楼梯等问题,答

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比