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

UVA 10588 - Queuing at the doctors

题目链接

题意:某公司要求每个员工都必须到当地的医院体检,并给每个员工安排了体检的顺序。为了节约等待时间,员工们被要求分时段去体检,但排队仍然是必不可少的。因此,公司制定了下面几条规定:

员工的编号从1到n。

员工在规定的时间点上一定准时到达医院开始体检。

员工有自己的体检顺序,并且一定按顺序来体检,直到体检完才离开医院。

当有多个员工在同一个时刻到同一个医生那体检时,编号小的优先,其他人按到达的先后顺序和编号大小排队等待。

已经知道每个医生在每单位1的时间内可以检查一个员工,给定所有员工的体检时间和体检顺序,请计算一下最后一个员工离开医院的时间。

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

思路:直接用队列和优先队列去模拟即可,开m个优先队列,表示每个医生,每次按时间再按标号做优先级。这题我一开始是把每个人对应看医生的序列一起丢进优先队列中,结果超时了,改了这个地方就过了

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

const int N = 1005;

int T, n, m;

struct Person {
    int t, id;
    bool operator < (const Person& c) const {
	if (t != c.t) return t > c.t;
	return id > c.id;
    }
} p;

priority_queue<Person> Q[N];
queue<int> q[N];

void init() {
    scanf("%d%d", &n, &m);
    int k, num;
    for (int i = 0; i < n; i++) {
	p.id = i;
	scanf("%d%d", &p.t, &k);
	for (int j = 0; j < k; j++) {
	    scanf("%d", &num);
	    num--;
	    q[p.id].push(num);
	}
	Q[q[p.id].front()].push(p);
    }
}

int solve() {
    int flag = 1, ans = 0;
    while (flag) {
	flag = 0;
	for (int i = 0; i < m; i++) {
	    if (!Q[i].empty()) {
		flag = 1;
		Person now = Q[i].top();
		if (ans < now.t) continue;
		Q[i].pop();
		q[now.id].pop();
		if (!q[now.id].empty()) {
		    now.t = ans + 1;
		    Q[q[now.id].front()].push(now);
		}
	    }
	}
	ans++;
    }
    return ans - 1;
}

int main() {
    scanf("%d", &T);
    while (T--) {
	init();
	printf("%d\n", solve());
    }
    return 0;
}

UVA 10588 - Queuing at the doctors(优先队列),布布扣,bubuko.com

时间: 2024-09-28 20:46:15

UVA 10588 - 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 (队列)

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

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

题目:UVA10588 - Queuing at the doctors(优先队列) 题目大意:员工体检:总共有M个医生,每个医生每一秒接待一位员工,然后每个员工都有一份检查列表,上面的检查顺序要被严格的执行,问这样检查最后一个员工离开诊所的时间. 解题思路:队列模拟,用优先队列来储存每个office的客人列表,记录进来的时间和序号.时间相同的序号小的优先,否则时间早的优先.然后给一个当前的时间now,在这个时间之前的病房前的第一个客人先体检,然后在将这个客人放到他下个要去的office的队列中

UVA 11573 - Ocean Currents【BFS+优先队列】

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2620 题意:给定一个海面,数字分别代表海流方向,顺着海流不用费能量,逆海流要费1点能量,每次询问给一个起点一个终点,问起点到终点耗费的最小能量 思路:广搜,队列用优先队列,每次取能量最低的点. 代码: #include <stdio.h> #include <

UVA 11573 - Ocean Currents(BFS+优先队列)

UVA 11573 - Ocean Currents 题目链接 题意:给定一个海面,数字分别代表海流方向,顺着海流不用费能量,逆海流要费1点能量.每次询问给一个起点一个终点.问起点到终点耗费的最小能量 思路:广搜,队列用优先队列.每次取能量最低的点出来进行状态的转移 代码: #include <cstdio> #include <cstring> #include <queue> using namespace std; const int d[8][2] = {{-1

UVa 10603 Fill (暴力BFS+优先队列)

题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和dd(可能和d相同). 析:首先由于没有刻度,如果用数学方法计算,不好算,样例还好算一点,我们观察那个a,b,c都不大于200,挺小的,适合暴力求解. 就是把所有情况都倒一次,倒水就两种倒法,要么把一个杯子倒满,要么就是这个杯子空了,由于水量是固定的,那么确定两个杯子的水量, 那么第三个也就确定了,所

UVA 12100 Printer Queue(队列和优先队列,水)

1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 typedef long long ll; 7 /** 8 题意:所有任务在队列中,若当前打印的任务优先级不是最大,则移动到队列尾部.问下标为k的任务在什么时刻被打印: 9 思路:用优先队列判断优先级是否最高.用队列模拟任务 10 (1)

10道ACM例题让你三天学会STL

清明节给大一的孩子们讲了点STL的应用,下了些功夫,搬到这里来供大家学习交流. 1.泛型程序设计简介与迭代器的介绍 2.常见的STL容器及其例题应用(UVA10474,UVA101,UVA10815,UVA156,UVA540,UVA136 HDU1027,CF501B,HDU1716,HDU4277) 3.相关练习和思路 1.泛型程序设计简介与迭代器的介绍 1.1 泛型程序设计简介 泛型程序设计,简单地说就是使用模板的程序设计法.将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,

UVA 11997 K Smallest Sums 优先队列 多路合并

vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一道题,这道题的简化版其实在 15 年的广东省省赛出现过,当时是以送分题的形式出现的,可我还是没能做出来,归根到底还是看书不够,接触的题型不够多. *************************************************************大白书上的讲解开始*******