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

【2024华为OD-E卷-200分-会议接待】(题目+思路+JavaC++Python解析)

题目

会议接待

某公司需要安排会议室接待客户,每个会议室在一天的不同时间段有不同的预约情况。你需要根据预约情况,找到一个满足以下条件的会议室:

  1. 会议室的容量大于等于所需的容量。
  2. 在指定的时间段内,会议室没有被预约。

输入

输入包含多个测试用例,每个测试用例描述如下:

  • 第一行包含两个整数 n 和 m,分别表示会议室的数量和查询的数量。
  • 接下来的 n 行,每行描述一个会议室的容量和预约情况:
    • 第一个整数 cap 表示会议室的容量。
    • 第二个整数 k 表示该会议室在一天中的预约数量。
    • 接下来的 k 行,每行包含两个整数 start 和 end,表示预约的开始时间和结束时间(单位:分钟)。
  • 接下来的 m 行,每行描述一个查询:
    • 第一个整数 need_cap 表示所需的容量。
    • 第二个整数 query_start 和第三个整数 query_end 表示查询的时间段(单位:分钟)。

输出

对于每个查询,输出满足条件的会议室编号(从1开始编号)。如果有多个会议室满足条件,输出编号最小的那个。如果没有会议室满足条件,输出 -1。

示例

输入

3 3
10 2
0 60
120 180
15 1
30 90
20 2
0 30
60 120
5 0 60
10 30 90
15 60 120

输出

1
2
-1

思路

  1. 预处理会议室的预约情况:对于每个会议室,我们需要预处理其预约的时间段,以便快速判断某个时间段是否可用。
  2. 查询处理:对于每个查询,遍历所有会议室,检查每个会议室在指定时间段内是否有预约,同时检查容量是否满足要求。

为了实现快速的时间段查询,可以使用线段树、树状数组或扫描线等数据结构,但考虑到题目给定的时间范围和数据量,直接遍历每个会议室的预约情况并检查是否冲突也是一种可行的方法。

Java 解析

import java.util.*;

class MeetingRoom {
    int cap;
    List<int[]> bookings;

    MeetingRoom(int cap, int k) {
        this.cap = cap;
        this.bookings = new ArrayList<>();
        for (int i = 0; i < k; i++) {
            int start = scanner.nextInt();
            int end = scanner.nextInt();
            bookings.add(new int[]{start, end});
        }
    }

    boolean isAvailable(int start, int end) {
        for (int[] booking : bookings) {
            if (start < booking[1] && end > booking[0]) {
                return false;
            }
        }
        return true;
    }
}

public class Main {
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        MeetingRoom[] rooms = new MeetingRoom[n];
        for (int i = 0; i < n; i++) {
            int cap = scanner.nextInt();
            int k = scanner.nextInt();
            rooms[i] = new MeetingRoom(cap, k);
        }

        for (int i = 0; i < m; i++) {
            int needCap = scanner.nextInt();
            int queryStart = scanner.nextInt();
            int queryEnd = scanner.nextInt();

            int result = -1;
            for (int j = 0; j < n; j++) {
                if (rooms[j].cap >= needCap && rooms[j].isAvailable(queryStart, queryEnd)) {
                    result = j + 1;
                    break;
                }
            }
            System.out.println(result);
        }
    }
}

C++ 解析

#include <iostream>
#include <vector>
using namespace std;

struct MeetingRoom {
    int cap;
    vector<pair<int, int>> bookings;

    MeetingRoom(int cap, int k) : cap(cap) {}

    bool isAvailable(int start, int end) {
        for (const auto& booking : bookings) {
            if (start < booking.second && end > booking.first) {
                return false;
            }
        }
        return true;
    }
};

int main() {
    int n, m;
    cin >> n >> m;

    vector<MeetingRoom> rooms(n);
    for (int i = 0; i < n; ++i) {
        int cap, k;
        cin >> cap >> k;
        rooms[i] = MeetingRoom(cap, k);
        for (int j = 0; j < k; ++j) {
            int start, end;
            cin >> start >> end;
            rooms[i].bookings.emplace_back(start, end);
        }
    }

    for (int i = 0; i < m; ++i) {
        int needCap, queryStart, queryEnd;
        cin >> needCap >> queryStart >> queryEnd;

        int result = -1;
        for (int j = 0; j < n; ++j) {
            if (rooms[j].cap >= needCap && rooms[j].isAvailable(queryStart, queryEnd)) {
                result = j + 1;
                break;
            }
        }
        cout << result << endl;
    }

    return 0;
}

Python 解析

class MeetingRoom:
    def __init__(self, cap, k):
        self.cap = cap
        self.bookings = []
        for _ in range(k):
            start, end = map(int, input().split())
            self.bookings.append((start, end))

    def is_available(self, start, end):
        for booking in self.bookings:
            if start < booking[1] and end > booking[0]:
                return False
        return True

if __name__ == "__main__":
    import sys
    input = sys.stdin.read
    data = input().split()
    
    index = 0
    n = int(data[index])
    index += 1
    m = int(data[index])
    index += 1
    
    rooms = []
    for _ in range(n):
        cap = int(data[index])
        index += 1
        k = int(data[index])
        index += 1
        room = MeetingRoom(cap, k)
        rooms.append(room)
        for _ in range(k):
            index += 2  # Skip the start and end times read by MeetingRoom constructor
    
    results = []
    for _ in range(m):
        need_cap = int(data[index])
        index += 1
        query_start = int(data[index])
        index += 1
        query_end = int(data[index])
        index += 1
        
        result = -1
        for room in rooms:
            if room.cap >= need_cap and room.is_available(query_start, query_end):
                result = rooms.index(room) + 1
                break
        results.append(result)
    
    for result in results:
        print(result)


http://www.kler.cn/a/472691.html

相关文章:

  • 【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)
  • 对快速由表及里说拜拜/如何正确运用由表及里
  • 游戏关卡设计的常用模式
  • python中的列表推导式详解
  • Linux的proc目录与什么有关?【以及它里面的文件各自记录着什么信息】
  • 数据库回滚:大祸临头时
  • Pytorch学习12_最大池化的使用
  • Elastic-Job相关
  • 案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践
  • 微信小程序动态更改富文本的css样式
  • Jenkins-持续集成、交付、构建、部署、测试
  • 腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏
  • QT学习二十一天 Quick 应用程序主窗口
  • 了解SQL
  • MongoDB的部署和操作
  • 微服务面试相关
  • Qt之Cannot create children for a parent that is in a different thread问题分析
  • uniapp的两种弹窗方式
  • ffmpeg aac s16 encode_audio.c
  • idea 编辑竖列:alt +shift+insert
  • Python的Matplotlib库应用(超详细教程)
  • C++ ——— 匿名对象
  • Spring AI零起点搭建AI应用
  • spring:xml声明bean的多种方式。
  • 电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)
  • Python —— 常用的字符串方法