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

来源:互联网 发布:域名劫持会出现什么 编辑:程序博客网 时间:2024/05/24 02:38

传送门: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|1using 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;}


0 0