UVA10588 - Queuing at the doctors(优先队列)

题目:UVA10588 - Queuing at the doctors(优先队列)

题目大意:员工体检:总共有M个医生,每个医生每一秒接待一位员工,然后每个员工都有一份检查列表,上面的检查顺序要被严格的执行,问这样检查最后一个员工离开诊所的时间。

解题思路:队列模拟,用优先队列来储存每个office的客人列表,记录进来的时间和序号。时间相同的序号小的优先,否则时间早的优先。然后给一个当前的时间now,在这个时间之前的病房前的第一个客人先体检,然后在将这个客人放到他下个要去的office的队列中。一直到病房里没有客人了,输出最后的now。

代码:

#include <cstdio>
#include <queue>
#include <cstring>

using namespace std;
const int N = 1005;
const int INF = 1e6 + 5;
typedef long long ll;

struct Person {

	int th;
	ll t;
	Person () {}
	Person (int th, ll t): th(th), t(t) {}
	bool operator < (const Person &a) const {

		return t > a.t || (t == a.t && th > a.th);
	}
};

priority_queue<Person> q[N];//office等待员工的队列
queue<int> p[N];//员工的检查清单
ll t[N];

int main () {

	int T;
	int n, m, k, item;
	int P;
	ll now;
	scanf ("%d", &T);
	while (T--) {

		scanf ("%d%d", &n, &m);
		now = INF;
		for (int i = 0; i < n; i++) {

			scanf ("%lld%d", &t[i], &k);
			now = min (now, t[i]);
			while (k--) {

				scanf ("%d", &item);
				p[i].push(item);
			}
		}

		for (int i = 0; i < n; i++) {

			if (!p[i].empty()) {
				P = p[i].front();
				p[i].pop();
				q[P].push(Person(i, t[i]));
			}
		}

		Person person;

		while (1) {
			for (int i = 1; i <= m; i++) {

				if (!q[i].empty()) {

					person = q[i].top();
					if (person.t > now)
						continue;
					if (!p[person.th].empty()) {

						P = p[person.th].front();
						p[person.th].pop();
						q[P].push(Person(person.th, now + 1));
					}
					q[i].pop();
				}
			}

//			printf ("%lld\n", now);
			ll min_n = INF;
			for (int i = 1; i <= m; i++) {
				if (!q[i].empty())
					min_n = min (min_n, q[i].top().t);
			}

			now++;
			if (min_n != INF)
				now = max (now, min_n);
			else
				break;

		}
		printf ("%lld\n", now);
	}
	return 0;
}
时间: 2024-10-12 15:20:11

UVA10588 - Queuing at the doctors(优先队列)的相关文章

uva 10588 - Queuing at the doctors(优先队列)

题目链接:uva 10588 - Queuing at the doctors 题目大意:公司安排职员去进行体检.一共有n个人,m个项目,给定每个职员到达医院的时间,以及需要体检的项目和顺序,每个项目检查一人需要消耗单位时间.每个项目的医生优先体检先到的职员,对于同时到的职员优先处理职员编号小的.求最后一个员工离开医院的时间. 解题思路:对每一个项目开一个优先队列,然后遍历时间,每次对时间满足进行体检,然后将人放到下一个这个人对应的下一个项目. #include <cstdio> #inclu

UVA 10588 - Queuing at the doctors(优先队列)

UVA 10588 - Queuing at the doctors 题目链接 题意:某公司要求每个员工都必须到当地的医院体检,并给每个员工安排了体检的顺序.为了节约等待时间,员工们被要求分时段去体检,但排队仍然是必不可少的.因此,公司制定了下面几条规定: 员工的编号从1到n. 员工在规定的时间点上一定准时到达医院开始体检. 员工有自己的体检顺序,并且一定按顺序来体检,直到体检完才离开医院. 当有多个员工在同一个时刻到同一个医生那体检时,编号小的优先,其他人按到达的先后顺序和编号大小排队等待.

UVA - 10588 Queuing at the doctors (队列)

Description Problem H: Queuing at the doctors Due to the increasing number of weird viruses spreading around, all the members of the International Confederation of Revolver Enthusiasts (ICORE) are required by their boss to do quarterly physical check

PQ(Priority queuing优先级队列)

                    PQ(Priority queuing优先级队列)                                       一种很传统,但不能不谈的队列 PQ是一种具备严格的,分等级执行调度的队列,它可以最多创建4个不同等级的队列,分别是高.中.普通.低:然后根据对不同的数据流量分类,将不同的分类数据送入到4个不同等级的队列.如图X所示,然后以100%的使用带宽的方式,首先服务于处于"高"队列中的数据,直到"高"队列中的数

51nod1428(优先队列)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 题意:中文题诶- 思路:贪心 问最少要多少教室就是求最多有多少个时间段产生了交集咯.我们先用结构体存储区间并将其按照左端点升序排列,若左端点相同则按右端点升序排列. 接下来遍历所有区间,并维护一个优先队列,其中存储区间右端点值.对于当前区间,我们将优先队列中所有比当前区间左端点小的元素删除(因为其所在区间不会与当前区间相交嘛),然后再将当前区间的右端点加

优先队列实现哈弗曼最小权值

建立哈弗曼树要求我们每次都选频率权值最小的点构成节点,即权值小的点在树的深处,权值大的点在树的浅处,根据节点选择的特点,我们可以把节点的值放在优先队列中,包括新形成的节点. 我们先定义优先队列的优先级别. 1 struct cmp 2 { 3 bool operator()(const int &a,const int &b) 4 { 5 return a>b; 6 } 7 };//最小值优先出队 然后就是实现的整个程序. #include<stdio.h> #inclu

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that consists of empty space

hdu 4006 The kth great number(优先队列)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6982    Accepted Submission(s): 2837 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

优先队列(堆)

一.优先队列的一些简单的实现: 1. 使用一个简单的链表在表头以O(1) 执行插入操作,并遍历该链表以删除最小元,这需要O(N) 的时间. 2. 始终让表保持有序状态:这使得插入代价高昂(O(N)), 而删除代价低廉(O(1)).基于删除最小元的操作从不多于插入操作的事实,因此,前者是更好地想法. 3. 使用二叉查找树,它对这两种操作的平均运行时间是O(logN).尽管插入是随机的,而删除不是,但这个结论还是成立的.由于删除的唯一元素是最小元.反复除去左子树中的节点似乎损害树的平衡,使得右子树加