最近比较忙,没太多时间,所以题目写的略微粗略一些。
重复的课程
输入N表示N节课,接下来输入N行每行输入课程的开始时间和结束时间,求最多的时候有几节课时间重了。
输入示例 :
4
1 4
1 2
2 3
3 4
输出:2
这个题目描述的就很神奇,题目竟然问的是最少?这里就不纠结题目,仅供讨论。
考虑一个时间段同时有几节课在上,在所有开始和结束的时间中遍历,如果开始一节课则同时上的课数目+1,结束一节课,则同时上的课数目-1。完整通过的人好像都是都是使用优先级队列,我觉得优先级队列在这里没必要。只需要记录一个数目即可。
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> start(n);
vector<int> end(n);
int a, b;
for(int i=0;i<n;i++)
{
cin >>a>>b;
start[i] = a;
end[i] = b;
}
sort(start.begin(),start.end());
sort(end.begin(),end.end());
int i=0, j=0, k=0, res=0;
while(i<n)
{
if (start[i]<end[j])
{
// 说明该在start[i]这个时段有课开了
k += 1;
i +=1;
res = max(k, res);
}
else
{
j+=1;
k-=1;
}
}
cout