题目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;
}
草稿纸:


被折叠的 条评论
为什么被折叠?



