题目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,结束会议-1maxRooms = 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;
}
草稿纸: