欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 【2024华为OD-E卷-200分-会议接待】(题目+思路+JavaC++Python解析)

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

2025/1/9 13:24:03 来源:https://blog.csdn.net/dengshengli123/article/details/144892639  浏览:    关键词:【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)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com