不开心的小朋友 - 华为OD统一考试

2023-12-30 14:52

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

OD统一考试

题解: Java / Python / C++

alt

题目描述

游乐场里增加了一批摇摇车,非常受小朋友欢迎,但是每辆摇摇车同时只能有一个小朋友使用如果没有空余的摇摇车,需要排队等候,或者直接离开,最后没有玩上的小朋友会非常不开心。请根据今天小朋友的来去情况,统计不开心的小朋友数量。

1、摇摇车数量为N,范围是: 1<=N<=10:

2、每个小朋友都对应一个编码,编码是不重复的数字,今天小朋友的来去情况可以使用编码表示为: 1 1 2 3 2 3。 (若小朋友离去之前有空闲的摇摇车则代表玩要后离开:不考虑小朋友多次玩的情况)。小朋友数量<=100

3、题目保证所有输入数据无异常目范围满足上述说明

输入描述

第一行: 摇摇车数量

第二行:小朋友来去情况

输出描述

返回不开心的小朋友数量

示例1

输入:
1
1 2 1 2输出:
0说明:
第一行,1个摇摇车
第二行,1号来 2号来(排队) 1号走 2号走(1号走后摇摇车已有空闲,所以玩后离开)

示例2

输入:
1
1 2 2 3 1 3输出:
1说明:
第一行,1个摇摇车
第二行,1号来 2号来 (排队) 2号走 (1号还没走,所以2号没玩3号来,1号走,3号走(1走后摇摇车有空闲,所以玩后离开)。只有2没玩

题解

模拟题

这个问题可以用队列来模拟小朋友玩摇摇车的过程。使用一个集合 playing 来记录当前正在玩摇摇车的小朋友,一个集合 unpappy 来记录因为没有玩到而不开心的小朋友,一个队列 waiting_queue 来记录排队的小朋友。

遍历输入的小朋友的来去情况,对每个小朋友进行如下操作:

  1. 如果小朋友在 playing 中,代表小朋友玩了一次后离开,此时需要检查排队队列 waiting_queue 是否有小朋友在排队,有的话让其中一个小朋友去玩,然后将其从排队队列中移除。
  2. 如果小朋友在 waiting_set 中,代表小朋友离开前排在摇摇车前排但是没有玩到,将其添加到 unpappy 中。
  3. 如果小朋友在 playingwaiting_set 中都不存在,说明小朋友是第一次来摇摇车。如果当前摇摇车有空位,直接让小朋友玩,并将其添加到 playing 中;否则,将小朋友添加到排队队列 waiting_queue 和排队集合 waiting_set 中。
  4. 最后输出 unpappy 集合的大小,即不开心的小朋友数量。

这个算法的时间复杂度是 O(N),其中 N 为小朋友的数量。

Java

import java.util.*;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();Set<Integer> playing = new HashSet<>(), unpappy = new HashSet<>();Set<Integer> waitingSet = new HashSet<>();Deque<Integer> waitingQueue = new LinkedList<>();while (scanner.hasNext()) {int boy = scanner.nextInt();if (playing.contains(boy)) {  // 玩后离开playing.remove(boy);while (!waitingQueue.isEmpty()) {  // 检测是否有在排队,有排队则可让一个小朋友去玩int nextBoy = waitingQueue.poll();if (waitingSet.contains(nextBoy)) {  // 小朋友任然在排队playing.add(nextBoy);waitingSet.remove(nextBoy);break;}}} else if (waitingSet.contains(boy)) {  // 不想等直接离开(不开心)unpappy.add(boy);waitingSet.remove(boy);} else if (playing.size() < N) {  // 有空闲的可以玩playing.add(boy);} else {   // 没有空闲,进行排队waitingQueue.offer(boy);waitingSet.add(boy);}}System.out.println(unpappy.size());}
}

控制台模拟数据结束输入使用 Ctrl +D

Python

from collections import dequeN = int(input())
q = list(map(int, input().split()))# 正在玩的小朋友, 没玩到不开心的小朋友
playing, unpappy = set(), set()
# 排队队列,排队中的小朋友
waiting_set, waiting_queue = set(), deque()for boy in q:if boy in playing:  # 玩后离开playing.remove(boy)while waiting_queue:  # 检测是否有在排队, 有排队则可让一个小朋友去玩next_boy = waiting_queue.popleft()if next_boy in waiting_set:  # 小朋友任然在排队playing.add(next_boy)waiting_set.remove(next_boy)breakelif boy in waiting_set:  # 不想等直接离开(不开心)unpappy.add(boy)waiting_set.remove(boy)elif len(playing) < N:  # 有空闲的可以玩playing.add(boy)else:   # 没有空闲,进行排队waiting_queue.append(boy)waiting_set.add(boy)print(len(unpappy))

C++

#include <iostream>
#include <unordered_set>
#include <deque>using namespace std;int main() {int N;cin >> N;unordered_set<int> playing, unpappy, waitingSet;deque<int> waitingQueue;int boy;while (cin >> boy) {if (playing.count(boy)) {  // 玩后离开playing.erase(boy);while (!waitingQueue.empty()) {  // 检测是否有在排队,有排队则可让一个小朋友去玩int nextBoy = waitingQueue.front();waitingQueue.pop_front();if (waitingSet.count(nextBoy)) {  // 小朋友任然在排队playing.insert(nextBoy);waitingSet.erase(nextBoy);break;}}} else if (waitingSet.count(boy)) {  // 不想等直接离开(不开心)unpappy.insert(boy);waitingSet.erase(boy);} else if (playing.size() < N) {  // 有空闲的可以玩playing.insert(boy);} else {   // 没有空闲,进行排队waitingQueue.push_back(boy);waitingSet.insert(boy);}}cout << unpappy.size() << endl;return 0;
}

CodeBlocks 控制台结束输入使用 Ctrl + C

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

这篇关于不开心的小朋友 - 华为OD统一考试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

定价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()和