当前位置: 首页 > news >正文

(新卷,100分)- 会议室占用时间(Java JS Python C)

(新卷,100分)- 会议室占用时间(Java & JS & Python & C)

题目描述

现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间,格式为:

[[会议1开始时间, 会议1结束时间], [会议2开始时间, 会议2结束时间]]

请计算会议室占用时间段。

输入描述

第一行输入一个整数 n,表示会议数量

之后输入n行,每行两个整数,以空格分隔,分别表示会议开始时间,会议结束时间

输出描述

输出多行,每个两个整数,以空格分隔,分别表示会议室占用时间段开始和结束

备注
  • 会议室个数范围:[1, 100]
  • 会议室时间段:[1, 24]
用例
输入4
1 4
2 5
7 9
14 18
输出1 5
7 9
14 18
说明

输入:[[1,4],[2,5],[7,9],[14,18]]

输出:[[1,5],[7,9],[14,18]]

说明:时间段[1,4]和[2,5]重叠,合并为[1,5]

输入2
1 4
4 5
输出1 5
说明

输入:[[1,4],[4,5]]

输出:[[1,5]]

说明:时间段[1,4]和[4,5]连续

题目解析

本题实际考试时为核心代码模式,非ACM模式,即无需处理输入输出。

本博客代码实现仍然以ACM模式处理,但是会将 "输入输出处理" 与 "核心代码" 分开,大家只看核心代码即可。

本题是区间合并问题。

我们可以将所有区间开始起始位置升序,然后取出第一个区间作为基准值pre,从第二个区间cur开始遍历:

  • 如果 cur.start <= pre.end,则说明两个区间有重叠,此时我们应该将两个区间合并,合并策略是将pre.end =max(pre.end, cur.end),比如:

    pre = [1, 4],cur = [2, 5],那么按此策略合并后,pre = [1, 5]

    pre = [1, 100],cur = [7, 9],那么按此策略合并后,pre = [1, 100]
  • 如果 cur.start > pre.end,则说明两个区间无交集,此时pre无法和后面任何区间合并(因为已经按照开始时间升序了,后面区间的开始时间肯定也大于pre.end),此时pre时间段就是一个独立的会议室占用时间,我们将它缓存记录下来,并将更新pre = cur,即将cur作为新的基准值和后面的区间比较

按此逻辑,即可完成所有区间的合并。

JS算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; // 输入输出处理 void (async function () { const n = parseInt(await readline()); const roomTimes = []; for (let i = 0; i < n; i++) { roomTimes.push((await readline()).split(" ").map(Number)); } merge(roomTimes).forEach(([start, end]) => console.log(`${start} ${end}`)); })(); // 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法实现即可 function merge(roomTimes) { // 将各个会议按照开始时间升序 roomTimes.sort((a, b) => a[0] - b[0]); // 记录合并后的会议室占用时间段 const ans = []; // 上一个会议占用时间段 let pre = roomTimes[0]; for (let i = 1; i < roomTimes.length; i++) { // 当前会议占用时间段 const cur = roomTimes[i]; if (cur[0] <= pre[1]) { // 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 // 注意合并时,结束时间取两个时间段中较大的结束时间 pre[1] = Math.max(pre[1], cur[1]); } else { // 否则不可以合并 ans.push(pre); pre = cur; } } ans.push(pre); return ans; }
Java算法源码
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { // 输入输出处理 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] roomTimes = new int[n][2]; for (int i = 0; i < n; i++) { roomTimes[i][0] = sc.nextInt(); roomTimes[i][1] = sc.nextInt(); } int[][] res = new Main().merge(roomTimes); for (int[] time : res) { System.out.println(time[0] + " " + time[1]); } } // 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法实现即可 public int[][] merge(int[][] roomTimes) { // 将各个会议按照开始时间升序 Arrays.sort(roomTimes, (a, b) -> a[0] - b[0]); // 记录合并后的会议室占用时间段 ArrayList<int[]> list = new ArrayList<>(); // 上一个会议占用时间段 int[] pre = roomTimes[0]; for (int i = 1; i < roomTimes.length; i++) { // 当前会议占用时间段 int[] cur = roomTimes[i]; if (cur[0] <= pre[1]) { // 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 // 注意合并时,结束时间取两个时间段中较大的结束时间 pre[1] = Math.max(pre[1], cur[1]); } else { // 否则不可以合并 list.add(pre); pre = cur; } } list.add(pre); return list.toArray(new int[0][]); } }
Python算法源码
# 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法实现即可 def merge(roomTimes): # 将各个会议按照开始时间升序 roomTimes.sort(key=lambda x: x[0]) # 记录合并后的会议室占用时间段 ans = [] # 上一个会议占用时间段 pre = roomTimes[0] for i in range(1, len(roomTimes)): # 当前会议占用时间段 cur = roomTimes[i] if cur[0] <= pre[1]: # 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 # 注意合并时,结束时间取两个时间段中较大的结束时间 pre[1] = max(pre[1], cur[1]) else: # 否则不可以合并 ans.append(pre) pre = cur ans.append(pre) return ans # 输入输出处理 n = int(input()) roomTimes = [] for _ in range(n): roomTimes.append(list(map(int, input().split()))) for start, end in merge(roomTimes): print(f"{start} {end}")
C算法源码
#include <stdio.h> #include <stdlib.h> int rows = 0; int cmp(const void *a, const void *b) { return (*(int **) a)[0] - (*(int **) b)[0]; } // 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法相关实现即可 int **merge(int **roomTimes, int roomTimes_size) { // 将各个会议按照开始时间升序 qsort(roomTimes, roomTimes_size, sizeof(int *), cmp); // 记录合并后的会议室占用时间段 int** res = (int**) malloc(sizeof(int*) * roomTimes_size); // 上一个会议占用时间段 int* pre = roomTimes[0]; // 当前会议占用时间段 for(int i=1; i<roomTimes_size; i++) { int* cur = roomTimes[i]; if(cur[0] <= pre[1]) { // 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 // 注意合并时,结束时间取两个时间段中较大的结束时间 if(cur[1] > pre[1]) { pre[1] = cur[1]; } } else { res[rows++] = pre; pre = cur; } } res[rows++] = pre; return res; } // 输入输出处理 int main() { int n; scanf("%d", &n); int **roomTimes = (int **) malloc(sizeof(int *) * n); for (int i = 0; i < n; i++) { roomTimes[i] = (int *) malloc(sizeof(int) * 2); scanf("%d %d", &roomTimes[i][0], &roomTimes[i][1]); } int **res = merge(roomTimes, n); for (int i = 0; i < rows; i++) { printf("%d %d\n", res[i][0], res[i][1]); } return 0; }
http://www.cnnetsun.cn/news/405314.html

相关文章:

  • 零基础小白必看的ComfyUI核心功能全攻略:放大/重绘/LoRA/ControlNet一次掌握
  • 移位字符串分组:别被“字符串”仨字吓住,其实是在找“不变量”
  • 1.7 数据挖掘标准流程:CRISP-DM方法论在企业中的实战应用
  • 1.12 快消行业数据决策:新品设计、供应链预测、智能推荐系统
  • 1.16 注册类指标 vs 活跃类指标:数据分析师必须知道的指标选择策略
  • 深度学习毕设项目:基于迁移学习的睡意检测报警系统人工智能
  • 深度学习毕设项目推荐-基于机器学习的睡意检测报警系统
  • 探索愈发开放的团队集体好奇心
  • 计算机深度学习毕设实战-基于人工智能Yolo3教学辅助系统的开发(学生考试监考系统)
  • leetcode 844. Backspace String Compare 比较含退格的字符串-耗时100%
  • 智能辅助学术写作:9款AI工具全方位提升开题与论文效率
  • 深度测评 8个一键生成论文工具:本科生毕业论文写作全攻略
  • 提示工程架构师实战案例:用Prompt生成的动漫表情包,成为了网络热梗!
  • 【SSA三维路径规划】麻雀算法无人机复杂环境(多山峰 威胁区)三维路径规划【含Matlab源码 14822期】
  • JavaScript性能优化实战大纲
  • 基于微信小程序的医院管理系统【源码+文档+调试】
  • 大规模语言模型在自动学术同行评议中的应用与挑战
  • 基于SSM二手物品交易网站系统毕设源码+文档+讲解视频
  • 华为Pura 80系列有多香?到手可升级鸿蒙 6,至高还减1500元
  • Elasticsearch:在 Streams 中使用 ML 自动化 log 解析
  • vue基于Python基于大数据技术的共享单车数据分析与辅助管理系统 _Pycharm django flask
  • vue+uniapp+小程序社区老年人活动志愿者服务系统
  • 学霸同款10个AI论文平台,专科生轻松搞定毕业论文!
  • vue+uniapp+基于微信小程序的云校园信息服务系统的设计与实现_943wpi16--论文
  • Mac下使用conda安装PyTorch环境
  • python虚拟环境实践:Conda 环境激活报错及解决
  • 医院病历电子化加速:门诊处方单文字识别一步到位
  • 大数据领域数据服务:实现数据的多维度分析与应用
  • ONNX格式转换尝试:能否将HunyuanOCR导出为跨框架通用模型?
  • LaTeX公式识别也行?测试腾讯HunyuanOCR对学术文档的支持能力