1 条题解
-
0
题解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
信息
- ID
- 1136
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 256
- 已通过
- 76
- 上传者