6170. 会议室 III(关于自定义sort的惨案)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6170. 会议室 III(关于自定义sort的惨案)相关的知识,希望对你有一定的参考价值。

6170. 会议室 III(关于自定义sort的惨案)

思路就很简单。

第一种方法就是直接按照题意模拟可以过。

class Solution 
public:
    struct node
        long long x;
        int id;
        bool operator<(const node&a)const
            return x==a.x?id>a.id:x>a.x;
        
    ;
    int mostBooked(int n, vector<vector<int>>& a) 
        int m =a.size();
        sort(a.begin(),a.end());
        
       // priority_queue<node>q;
        vector<int>ans(n);
        vector<long long>b(n);
        for(int i=0;i<m;i++)
            int l =a[i][0],r=a[i][1];
            int ok = 0;
            int mn = 0;
            for(int j=0;j<n;j++)
                if(b[j]<=l)
                    ans[j]++;
                    b[j] = r;
                    ok = 1;break;
                
                if(b[j]<b[mn]) mn = j;
            
            if(!ok)
                ans[mn]++;
                b[mn]+=r-l;
            
        
        int res=0;
        for(int i=0;i<n;i++)
            if(ans[i]>ans[res])
                res=i;
            
        return res;
    
;

第二种方法:优先队列维护每个会议室的结束时间和id。

如果当前结束时间<区间l 那么修改结束时间为l。

因为可能存在多个满足条件的,需要取最小的id。

class Solution 
public:
    struct node
        long long x;
        int id;
        bool operator<(const node&a)const
            return x==a.x?id>a.id:x>a.x;
        
    ;
    int mostBooked(int n, vector<vector<int>>& a) 
        int m =a.size();
        sort(a.begin(),a.end(),[&](auto &u,auto &v)
            return u[0]<v[0];
        );
        
        priority_queue<node>q;
        vector<int>ans(n);
        for(int i=0;i<n;i++) q.push(0,i);
        //int now = 0;
        int idx = 0;
        while(!q.empty() && idx<m)
            auto u =q.top();q.pop();
            long long x=u.x;
            int id=u.id;
            int l = a[idx][0],r=a[idx][1];
            if(x<l)
                //printf("(%d,%d,%d)\\n",id,x,r);
                //ans[id]++;
                q.push(l,id);
            
            else 
                //printf("-(%d,%d,%d)\\n",id,x,x+r-l);
                idx++;
                ans[id]++;
                q.push(x+r-l,id);
            
            
        
        int res=0;
        for(int i=0;i<n;i++)
            if(ans[i]>ans[res])
                res=i;
            
        return res;
    
;

第三种方法,使用mutliset维护。

class Solution 
public:
    struct node
        long long x;
        int id;
        bool operator<(const node&a)const
            return x==a.x?id>a.id:x>a.x;
        
    ;
    int mostBooked(int n, vector<vector<int>>& a) 
        int m =a.size();
        sort(a.begin(),a.end(),[&](auto &u,auto &v)
            return u[0]<v[0];
        );
        
       // priority_queue<node>q;
        vector<int>ans(n);
        multiset<pair<long long,int> >v;
        for(int i=0;i<n;i++)
            v.insert(0,i);
        
        for(int i=0;i<m;i++)
            int l =a[i][0],r=a[i][1];
            auto it = v.upper_bound(l,n);
            
            if(it==v.begin())
                long long x = it->first,id=it->second;
                v.erase(it);
                v.insert(x+r-l,id);
          //      printf("id=%d\\n",id);
                ans[id]++;
                continue;
                        
            --it;
            int mn = n;
            auto tmp =v.begin();
            while(it!=v.begin())
                if(mn>it->second)
                    mn = it->second;
                    tmp = it;
                
                --it;
            
            if(mn>it->second)
                    mn = it->second;
                    tmp = it;
                
            ans[mn]++;
            v.erase(tmp);
            v.insert(r,mn);
        
     //   puts("");
        int res=0;
        for(int i=0;i<n;i++)
            if(ans[i]>ans[res])
                res=i;
            
        return res;
    
;

重要!!!

在重载排序函数的时候,一定要传引用,不要传值。

此题如果传值,相当于每次比较都需要复制一次vector,开销非常大,在leetcode的评测环境下会直接导致 T L E TLE TLE

sort(a.begin(),a.end(),[&](auto &u,auto &v)//正确写法
            return u[0]<v[0];
        );


sort(a.begin(),a.end(),[&](auto u,auto v)//错误写法
            return u[0]<v[0];
        );

以上是关于6170. 会议室 III(关于自定义sort的惨案)的主要内容,如果未能解决你的问题,请参考以下文章

86双周t4 6143. 预算内的最多机器人数目 周赛309 t4 6170. 会议室 III

关于Lucene的自定义Sort排序

关于回调函数 usort() uksrot() sort() 介绍简介实验是从小到大排序

圆桌会议III: webpack简介

打开约会项目时显示自定义任务窗格(会议发生和个人会议)

android自定义View实现会议时间的占比效果