算法题——最小会议室数量

题目1:
1.假定会议时间从凌晨零点开始,即
0<=si<ei<1440,si和ei代表当天某一时刻从零点开始计算的开始和结束分钟数,如[90,360],表示会议时间从1:30到6:00。
2.不考虑房间的容量问题,并且公司为了提升大家的体验,同一个会议室在结束一次会议后会进行10分钟的情理工作,才能进行下一次会议。
输入描述:
输入值包含最少1行,最多10000行。每一行代表一个会议的开始和结束时间,并且以逗号分隔,如”start.end”所示,其中0<=start<end<1440,日start和end同为整数。
输出描述:
输出为一个整数,表示所需的最少房间数.
输入
10,20
输出
1
说明:只有1个会议,只需要1间房间即可
输入
10,20
25,35
输出
2
说明:考虑10分钟清理时间,两个会议时间会重叠,所以需要2个房间
输入
10,20
30,40
输出
1
两个会议不重叠,可以使用同一个房间

思路分析:结构体里面存时间和类型,类型1表示开始,-1表示结束
定义meetings向量,向量里面存一对int类型,表示输入开始的时间和结束的时间。然后event向量里面存结构体,比如拿例子10,20 30,40这个来说,meeting[0] = (10,20) meting[1] = (25,35) event[0] = (10,1) event[1] = (20+10=30,-1) event[2] = (30,1) event[4] = (50,-1) .然后对event排序按照时间,当时间相同的时候按照类型小的在前面也就是先处理结束时间。然后计算需要的房间数量,需要维护两个变量,一个市当前的房间数,一个是最大的房间数量。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 定义会议的起始和结束时间
struct Event {
    int time;    // 时间点
    int type;    // 事件类型:1表示开始,-1表示结束+清理时间
};
bool compareEvents(const Event& a, const Event& b) {
    // 如果时间相同,优先处理结束事件
    if (a.time == b.time) {
        return a.type < b.type;
    }
    return a.time < b.time;
}
int minMeetingRooms(vector<pair<int, int>>& meetings) {
    vector<Event> events;

    // 将会议的开始时间和结束+10分钟的时间加入事件列表
    for (auto& meeting : meetings) {
        events.push_back({ meeting.first, 1 });   // 会议开始事件
        events.push_back({ meeting.second + 10, -1 }); // 会议结束后加上10分钟清理时间
    }

    // 按时间排序事件,时间相同优先处理结束事件
    sort(events.begin(), events.end(), compareEvents);

    int currentRooms = 0;  // 当前需要的会议室数量
    int maxRooms = 0;      // 记录最大需要的会议室数量

    // 遍历所有事件,计算当前会议室的需求
    for (auto& event : events) {
        currentRooms += event.type; // 开始会议+1,结束会议-1
        maxRooms = max(maxRooms, currentRooms); // 更新最大会议室需求
    }

    return maxRooms; // 返回最大需要的会议室数量
}
int main() {
    // 输入示例数据
    vector<pair<int, int>> meetings;
    int start, end;
    char delimiter;

    while (cin >> start >> delimiter >> end) {
        meetings.push_back({ start, end });
    }

    // 计算最少需要的会议室数
    cout << minMeetingRooms(meetings) << endl;

    return 0;
}

草稿纸:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shan_shmily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值