1 条题解

  • 0
    @ 2025-10-8 16:56:00

    题解1:电脑分配问题(贪心算法)

    #include<bits/stdc++.h> 
    using namespace std; 
    const int N=5e4+10; 
    
    struct Pnode{//描述人结构体,l、r为使用电脑的开始和结束时间,pid为原编号,cid为电脑编号 
        int l,r,pid,cid; 
    }P[N]; 
    
    struct Cnode{//描述电脑结构体,l、r为使用时间,cid为电脑编号 
        int l,r,cid; 
        bool friend operator <(Cnode n1,Cnode n2){ return n1.r>n2.r; } //小根堆(按结束时间升序) 
    }; 
    
    int main(){ 
        int n;scanf("%d",&n); 
        for(int i=1;i<=n;i++){ 
            scanf("%d%d",&P[i].l,&P[i].r); 
            P[i].pid=i; 
        } 
        //按开始时间升序排序人 
        sort(P+1,P+n+1,[](Pnode n1,Pnode n2){ return n1.l<n2.l; }); 
    
        priority_queue <Cnode> Q; //维护空闲电脑的小根堆(按结束时间排序) 
        int cid=0; //电脑编号计数器 
        for(int i=1;i<=n;i++){ 
            Cnode t; 
            //若有空闲电脑且其结束时间早于当前人开始时间,复用该电脑 
            if(!Q.empty() && Q.top().r<P[i].l){ 
                t={P[i].l, P[i].r, Q.top().cid}; 
                Q.pop(); 
            } 
            //否则分配新电脑 
            else{ 
                t={P[i].l, P[i].r, ++cid}; 
            } 
            P[i].cid=t.cid; 
            Q.push(t); 
        } 
    
        printf("%d\n",cid); //输出最少电脑数 
        //按原编号排序人,输出每个人的电脑编号 
        sort(P+1,P+n+1,[](Pnode n1,Pnode n2){ return n1.pid<n2.pid; }); 
        for(int i=1;i<=n;i++) printf("%d\n",P[i].cid); 
    
        return 0; 
    }
    

    题解2:电脑分配问题(贪心算法,引用优化)

    #include<bits/stdc++.h> 
    using namespace std; 
    const int N=5e4+10; 
    
    struct Pnode{//描述人结构体,l、r为使用电脑的开始和结束时间,pid为原编号,cid为电脑编号 
        int l,r,pid,cid; 
    }P[N]; 
    
    struct Cnode{//描述电脑结构体,l、r为使用时间,cid为电脑编号 
        int l,r,cid; 
        bool friend operator <(const Cnode &n1,const Cnode &n2){ return n1.r>n2.r; } //小根堆(按结束时间升序,引用传递优化) 
    }; 
    
    int main(){ 
        int n;scanf("%d",&n); 
        for(int i=1;i<=n;i++){ 
            scanf("%d%d",&P[i].l,&P[i].r); 
            P[i].pid=i; 
        } 
        //按开始时间升序排序人(引用传递优化) 
        sort(P+1,P+n+1,[](const Pnode &n1,const Pnode &n2){ return n1.l<n2.l; }); 
    
        priority_queue <Cnode> Q; //维护空闲电脑的小根堆(按结束时间排序) 
        int cid=0; //电脑编号计数器 
        for(int i=1;i<=n;i++){ 
            Cnode t; 
            //若有空闲电脑且其结束时间早于当前人开始时间,复用该电脑 
            if(!Q.empty() && Q.top().r<P[i].l){ 
                t={P[i].l, P[i].r, Q.top().cid}; 
                Q.pop(); 
            } 
            //否则分配新电脑 
            else{ 
                t={P[i].l, P[i].r, ++cid}; 
            } 
            P[i].cid=t.cid; 
            Q.push(t); 
        } 
    
        printf("%d\n",cid); //输出最少电脑数 
        //按原编号排序人,输出每个人的电脑编号 
        sort(P+1,P+n+1,[](const Pnode &n1,const Pnode &n2){ return n1.pid<n2.pid; }); 
        for(int i=1;i<=n;i++) printf("%d\n",P[i].cid); 
    
        return 0; 
    }
    
    • 1

    *【堆】使用电脑不冲突 [USACO06FEB] Stall Reservations S

    信息

    ID
    1136
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    256
    已通过
    76
    上传者