选座位 - 华为OD统一考试(C卷)

2024-02-26 01:28
文章标签 统一 华为 考试 od 座位

本文主要是介绍选座位 - 华为OD统一考试(C卷),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0…N-1],要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。

满足:每当一个员工进入时,需要坐到最大社交距离的座位(例如:位置A与左右有员工落座的位置距离分别为2和2,位置B与左右有员工落座的位置距离分别为2和3,影响因素都为2个位置,则认为座位A和B与左右位置的社交距离是一样的),如果有多个这样的座位,则坐到索引最小的那个座位。

输入描述

会议室座位总数seatNum,(1 <= seatNum <= 500) 员工的进出顺序 seatOrLeave数组,元素值为1: 表示进场,元素值为负数,表示出场(特殊:位置0的员工不会离开)。

例如-4表示坐在位置4的员工离开 (保证有员工坐在该座位上)。

输出描述

最后进来员工,他会坐在第几个位置,如果位置已满,则输出-1。

示例1

输入:
10
[1, 1, 1, 1, -4, 1]输出:
5说明:
seat ->0,坐在任何位置都行,但是要给他安排索引最小的位置,也就是座位0。
seat ->9, 要和旁边的人距离最远,也就是座位9。
seat ->4,位置4与0和9的距离为(4和5),位置5与0和9的距离(5和4),所以位置4和5都是可以选择的座位,按照要求需索引最小的那个座位,也就是座位4。
seat ->2,位置2与0和4的距离为(2和2),位置6与4和9的距离(2和3),位置7与4和9的距离(3和2),影响因素都为2个位置,按照要求需索引最小的那个座位,也就是座位2。leave(4),4号座位的员工离开。
seat-> 5,员工最后坐在5号座位上。

此题为非ACM模式,只需要实现 conferenceSeatDistance 方法即可。

题解

这是一个模拟会议室座位安排的问题,需要根据特定规则安排员工的座位。

  1. 使用有序 Set 来维护已经被坐的座位情况(java 代码使用 TreeSet )。并通过插入两个虚拟的座位作为边界来方便计算最大社交距离的座位。
  2. 进入会议室的算法: 使用join方法来计算员工进入会议室时的最佳座位。通过遍历 TreeSet 中相邻的位置,计算中间座位的社交距离,找到最大距离的座位,并插入到 TreeSet 中。
  3. 座位计算: 在主方法中,遍历员工的进出顺序,根据不同情况调用join方法或者从TreeSet中移除座位。
  4. 输出: 输出最后一个员工坐的位置。

Java

import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int seatNum = sc.nextInt();sc.nextLine();String seatOrLeaveLine = sc.nextLine();String[] c = seatOrLeaveLine.substring(1, seatOrLeaveLine.length() - 1).split(", ");int[] seatOrLeave = new int[c.length];for (int i = 0; i < c.length; i++) {seatOrLeave[i] = Integer.parseInt(c[i]);}Main socialDistance = new Main();int ans = socialDistance.conferenceSeatDistance(seatNum, seatOrLeave);System.out.println(ans);}/*** 计算最后进来的人,坐的位置** @param seatNum     会议室座位总数* @param seatOrLeave 员工的进出顺序* @return 最后进来的人,坐的位置*/public int conferenceSeatDistance(int seatNum, int[] seatOrLeave) {TreeSet<Integer> seatTree = new TreeSet<>();// 插入两个虚拟的座位,有了这两个个边界方便计算最大社交距离的座位seatTree.add(-2 * (seatNum - 1));seatTree.add(2 * (seatNum - 1));int last = -1;for (int t : seatOrLeave) {if (t == 1) { // 进来last = join(seatTree, seatNum);} else { // 座位 -t 的人离开seatTree.remove(-t);}}return last;}/*** 计算员工进行会议该做的位置** @param seatTree 已经被坐的座位情况* @param N        会议室座位个数* @return -1 没有合适的位置可坐*/public int join(TreeSet<Integer> seatTree, int N) {// 最大的社交距离int maxDistance = 0, idx = -1;// 根据 TreeSet key 的有序性,遍历所有相邻的位置看中间的座位是否是会议室中社交距离最大的座位Iterator<Integer> it = seatTree.iterator();int pre = it.next();while (it.hasNext()) {int cur = it.next();int distance = (cur - pre) / 2;// 判断在 pre 和 cur 中间坐社交距离是否更大 if (distance > maxDistance) {// 坐在 pre 和 pre  中间的位置(索引最小的)int pos = (cur + pre) / 2;// 当前 pos 是有效的可坐位置if (0 <= pos && pos < N) {idx = pos;maxDistance = distance;}}pre = cur;}// 找到了合适的座位,则坐在 idx 位置上if (idx != -1) seatTree.add(idx);return idx;}
}

Python

from itertools import pairwiseclass Solution:def conference_seat_distance(self, seat_num, seat_or_leave):# 记录座位情况self.seat_list = [-2 * (seat_num - 1), 2 * (seat_num - 1)]last = -1for t in seat_or_leave:if t == 1:  # 进来last = self.join(seat_num)else:  # 座位 -t 的人离开self.seat_list.remove(-t)return lastdef join(self, N):max_distance, idx = 0, -1# 遍历所有相邻的位置看中间的座位是否是会议室中社交距离最大的座位for pre, cur in pairwise(self.seat_list):distance = (cur - pre) // 2# 判断在 pre 和 cur 中间坐社交距离是否更大if distance > max_distance:# 坐在 pre 和 pre  中间的位置(索引最小的)pos = (cur + pre) // 2# 当前 pos 是有效的可坐位置if 0 <= pos < N:idx = posmax_distance = distance# 找到了合适的座位,则坐在 idx 位置上if idx != -1:self.seat_list.append(idx)self.seat_list.sort()return idxsolution = Solution()
last = solution.conference_seat_distance(10, [1, 1, 1, 1, -4, 1])
print(last)

C++

#include <iostream>
#include <vector>
#include <set>using namespace std;class Solution {
public:int conferenceSeatDistance(int seatNum, vector<int>& seatOrLeave) {set<int> seatTree;seatTree.insert(-2 * (seatNum - 1));seatTree.insert(2 * (seatNum - 1));int last = -1;for (int t : seatOrLeave) {if (t == 1) {last = join(seatTree, seatNum);} else {seatTree.erase(-t);}}return last;}int join(set<int>& seatTree, int N) {int maxDistance = 0, idx = -1;auto it = seatTree.begin();int pre = *it++;while (it != seatTree.end()) {int cur = *it++;int distance = (cur - pre) / 2;if (distance > maxDistance) {int pos = (cur + pre) / 2;if (pos >= 0 && pos < N) {idx = pos;maxDistance = distance;}}pre = cur;}if (idx != -1) seatTree.insert(idx);return idx;}
};

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

这篇关于选座位 - 华为OD统一考试(C卷)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

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行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

UML- 统一建模语言(Unified Modeling Language)创建项目的序列图及类图

陈科肇 ============= 1.主要模型 在UML系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功能,包括用例图。 对象模型:采用对象、属性、操作、关联等概念展示系统的结构和基础,包括类图、对象图、包图。 动态模型:展现系统的内部行为。 包括序列图、活动图、状态图。 因为要创建个人空间项目并不是一个很大的项目,我这里只须关注两种图的创建就可以了,而在开始创建UML图