HDU 2529 Queuing at the doctors 优先队列+模拟

    xiaoxiao2021-03-26  28

    传送门:HDU2529

    题意:某公司要求每个员工都必须到当地的医院体检,并给每个员工安排了体检的顺序。为了节约等待时间,员工们被要求分时段去体检,但排队仍然是必不可少的。因此,公司制定了下面几条规定: 员工的编号从1到n。 员工在规定的时间点上一定准时到达医院开始体检。 员工有自己的体检顺序,并且一定按顺序来体检,直到体检完才离开医院。 当有多个员工在同一个时刻到同一个医生那体检时,编号小的优先,其他人按到达的先后顺序和编号大小排队等待。 已经知道每个医生在每单位1的时间内可以检查一个员工,给定所有员工的体检时间和体检顺序,请计算一下最后一个员工离开医院的时间。

    一共有N(1 ≤ N ≤ 1000)个员工,M(1 ≤ M ≤ 1000)个医生,所有人总的检查次数不超过10000000

    思路:用一个优先队列数组去模拟每一个医生的排队状况,用队列数组去记录每个人的检查顺序,然后按时间递增顺序进行模拟直到优先队列为空。

    代码:

    #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<stack> #include<set> #include<vector> #include<map> #define ll long long #define pi acos(-1) #define inf 0x3f3f3f3f #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std; typedef pair<int,int>P; const int MAXN=1010; struct node{ int id,t; friend bool operator <(node a,node b) { if(a.t==b.t)return a.id>b.id; return a.t>b.t; } }; priority_queue<node>Q[MAXN]; queue<int>q[MAXN]; int n,m; int solve() { bool flag=1; int ans=0;//模拟时间增长 node t; while(flag) { flag=0; for(int i=1;i<=m;i++) { if(!Q[i].empty()) { flag=1; t=Q[i].top(); if(t.t>ans)continue;//时间到了才能出队 Q[i].pop(); t.t=ans+1; if(!q[t.id].empty()) { Q[q[t.id].front()].push(t); q[t.id].pop(); } } } ans++; } return ans-1; } int main() { int t,num,x; node a; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d%d",&a.t,&num); while(num--) { scanf("%d",&x); q[i].push(x); } a.id=i; Q[q[i].front()].push(a); q[i].pop(); } printf("%d\n",solve()); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-662462.html

    最新回复(0)