编程练习9 会议室占用时间段

这个主要是对边界条件的处理需要注意,比如只有一个会议,两个会议以及重叠与不重叠各种情况。

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct MeetingTime {
    int start;
    int end;
};

bool compare(const MeetingTime &a, const MeetingTime &b) {
    return a.start < b.start;
}

int main() {
	int meeting_num = 0;
	cin >> meeting_num;
	vector<MeetingTime> meetings;
    for (int i = 0; i < meeting_num; i++) 
	{
		MeetingTime a;
		cin >> a.start >> a.end;
		meetings.push_back(a);
    }
    
    // 假设已经通过某种方式填充了meetings向量
    // 例如:meetings = {{1, 4}, {2, 5}, {7, 9}, {14, 18}};
    
    // 排序
    sort(meetings.begin(), meetings.end(), compare);
    
    // 合并时间段
    vector<MeetingTime> merged;
	int meetings_num = meetings.size();
    for (int i = 0; i < meetings_num; ++i) {
		//如果只有一个会议 直接输出
		if(meetings.size() == 1)
		{
			merged.push_back(meetings[i]);
		}
		//如果当前会议时间和后面一个会议重叠 则需要将两次会议合并 直接将合并后的会议替换下一个会议时间
        else if (meetings[i].end >= meetings[i + 1].start && i<meetings_num-1) 
		{
            MeetingTime curr = meetings[i];
            if (meetings[i].end < meetings[i + 1].end) {
                curr.end = meetings[i + 1].end;
            }
			
			meetings[i + 1].start = curr.start;
			meetings[i + 1].end = curr.end;		
        }
		else
		{
			//如果是倒数第二个会议 需要单独处理
			if(i == meetings.size()-2)
			{
				//如果与最后一个会议不重叠 则将当前会议输出
				if(meetings[i].end < meetings[i + 1].start)
				{
					merged.push_back(meetings[i]);
					//merged.push_back(meetings[i+1]);
				}
				else if(meetings[i].end >= meetings[i + 1].start)
				{
					 MeetingTime curr = meetings[i];
					if (meetings[i].end < meetings[i + 1].end) {
						curr.end = meetings[i + 1].end;
					}
					merged.push_back(curr);
				}

			}
			else
			{
				merged.push_back(meetings[i]);
			}
		}
		
    }
    
    // 输出结果
    for (const auto &m : merged) {
        cout << m.start << " " << m.end << endl;
    }
    
    return 0;
}
相关推荐
Rabitebla20 分钟前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
system_error_x27 分钟前
C++ 编程基础入门教程
开发语言·c++
远离UE432 分钟前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君65840 分钟前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐1 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
Tairitsu_H2 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划
凯瑟琳.奥古斯特2 小时前
动态调优IoU提升OCR文本合并精度
开发语言·python·算法
布莱克6052 小时前
A* 算法详解:从原理到实现
开发语言·c++·算法
多弗朗皮卡丘2 小时前
C++ 智能指针
开发语言·c++·c++11·智能指针
段一凡-华北理工大学3 小时前
高炉炼铁机器视觉与智能识别十八讲~系列文章15:可靠性篇:防误报、容错与识别系统的鲁棒性设计
人工智能·算法·机器学习·高炉大模型·高炉机器视觉·高炉炼铁模型开发