题目:给定一堆会议起始日期
和结束日期
,可以在期间任何一天参加会议
,求可以参加的最多的会议数目。
思路:这题和经典的会议安排
题目的区别在于,这里可以在会议开始日期和结束日期之间的任一天
参加该会议就算参加,而会议安排
则要求在起始时间
和结束时间
区间一直参加。
遍历开会的每一天,将第i天开始的会议全部加入set, 再将第i天结束的会议全部从set删除,因此留下的都是第i天可以开的会议。然后基于贪心思想,将set里结束时间最早的会议删除,表示我们在第i天开了这个会议。
int maxEvents(vector<vector<int>>& events){
set<pair<int, int> > S;
int N=100005;
vector<vector<int>> in(N);
vector<vector<int>> out(N);
int maxDay = 0;
for(int i=0; i<events.size(); i++){
int st = events[i][0];
int ed = events[i][1];
maxDay = max(maxDay, ed);
in[st].push_back(i);
out[ed+1].push_back(i);
}
int ans = 0;
for(int i=1; i<=maxDay; i++){
//把第i天开始的会议全部加入set
for(int j=0; j<in[i].size(); j++){
int cur = in[i][j];
S.insert(make_pair(events[cur][1], cur));
}
//把第i天结束的会议全部从set删除
for(int j=0; j<out[i].size(); j++){
int cur = out[i][j];
auto it = S.find(make_pair(events[cur][1], cur));
if(it != S.end()){
S.erase(it);
}
}
//至此留下的都是第i天可以开的会议
if(!S.empty()){
S.erase(S.begin()); //把结束时间最早的会议删除,表示第i天我们开了这个会
ans++;
}
}
return ans;
}
网友评论