美文网首页
1353. 最多可参加的会议数目

1353. 最多可参加的会议数目

作者: 乘瓠散人 | 来源:发表于2021-04-16 09:52 被阅读0次

题目:给定一堆会议起始日期和结束日期可以在期间任何一天参加会议,求可以参加的最多的会议数目。
思路:这题和经典的会议安排题目的区别在于,这里可以在会议开始日期和结束日期之间的任一天参加该会议就算参加,而会议安排则要求在起始时间结束时间区间一直参加。
遍历开会的每一天,将第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;
}

相关文章

网友评论

      本文标题:1353. 最多可参加的会议数目

      本文链接:https://www.haomeiwen.com/subject/jywakltx.html