UVA540-队列

题意:

每一个数字有自己所属的团队,如果所属的团队已经有人在队列里,放在团队的最后一个,要不然放队列里最后一个

注意:一个团队里的最多1000个元素,但是入队,出队的操作会达到200000次

解法:循环队列,声明一个n长的数组,数组的每一个元素都是一个循环队列

没有判断队列是否满了,只简单的判断是否为空

AC时间:570ms

主要耗时在查找元素是那个团队时循环了所有元素,可以简单粗暴使用STL,用了就没意义了,o(︶︿︶)o 唉!!!

#include<iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

struct Node
{
	int num;
	int team;
	Node()
	{
		num = -1;
		team = -1;
	}
};
struct Queue
{
	int ql;
	Node node[1003];
	int position;
	int limit;
	Queue()
	{
		ql = 1003;
		position = 0;
		limit = 0;
	}
	void push(Node n)
	{
		node[position]=n;
		position=(position+1)%ql;
	}
	Node offer()
	{
		Node n= node[limit];
		limit=(limit+1)%ql;
		return n;
	}
	bool empty()
	{
		return limit == position;
	}
};

int findTeam(int number, Node* node, int nl)
{
	for(int i = 0; i < nl; i++)
	{
		if(node[i].num == number)
		{
			return node[i].team;
		}
	}
	return -1;
}
int findQueue(int team, Queue*head, int tl)
{
	for(int i = 0; i < tl; i++)
	{
		if(head[i].node[0].team == team)
		{
			return i;
		}
	}
	return tl;
}
int main()
{
	//freopen("d:\\1.txt", "r", stdin);
	int n;
	string eq = "ENQUEUE";
	string de = "DEQUEUE";
	string stop = "STOP";
	int t = 0;
	while (cin >> n)
	{
		if(n == 0)
			return 0;
		t++;
		cout << "Scenario #" << t << endl;
		Node node[n * 1003];
		Queue head[n];
		int tn = 0;
		for(int i = 0; i < n; i++)
		{
			Queue h;
			head[i] = h;
			int m;
			cin >> m;
			for(int j = 0; j < m; j++)
			{
				Node node2;
				cin >> node2.num;
				node2.team = i;
				node[tn++] = node2;
			}
		}
		string str;
		int number;
		int tl = 0;
		while (true)
		{
			cin >> str;
			if(str == stop)
				break;
			else if(str == de)
			{
				//de
				cout << head[0].offer().num << endl;
				if(head[0].empty())
				{
					int i = 1;
					for(i = 0; i < tl-1; i++)
					{
						head[i] = head[i+1];
					}
					head[tl-1].limit = 0;
					head[tl-1].position = 0;
					tl--;
				}
			}
			else
			{
				//en
				cin >> number;
				int team = findTeam(number, node, tn);
				int i = findQueue(team,head, tl);
				Node nn;
				nn.num = number;
				nn.team = team;
				if(head[i].position == 0)
					tl++;
				head[i].push(nn);
			}
		}
		cout << endl;
	}
	return 0;
}

  

时间: 2024-10-18 17:12:19

UVA540-队列的相关文章

ACM学习历程——UVA540 Team Queue(队列,map:Hash)

Description Team Queue   Team Queue  Queues and Priority Queues are data structures which are known to most computer scientists. The Team Queue, however, is not so well known, though it occurs often in everyday life. At lunch time the queue in front

5_6 团体队列(UVa540)&lt;queue与STL其他容器的综合运用&gt;

先给出T个团体,并给出每个团体有多少人和每个人的编号,然后所有团体一起排队,排成一条大队列,排队的原则是,一个成员加入,如果这个成员所在的团体已经有人在排队了,那么他就加到他所在团体的最后面,而不是整个大队列的最后.如果整个大队列中没有他的团体,也就是他是他的那个团体第一个来的人,那么他就要排在整个大队列的最后(当然,他成为了他这个团体的第一人,以后他的队友来了就可以排他后面) [输入] 输入文件将包含一个或多个测试案例.每个测试案例第一个是团队T的数量.然后,接下来的T行为团队每个人的编号,编

Uva540(队列)

Team Queue UVA - 540 Queues and Priority Queues are data structures which are known to most computer scientists. The Team Queue, however, is not so well known, though it occurs often in everyday life. At lunch time the queue in front of the Mensa is

UVA540 Team Queue——题解 by hyl天梦

UVA540 Team Queue 题解 题目描述:题目原题 https://vjudge.net/problem/UVA-540 Queues and Priority Queues are data structures which are known to most computer scientists. The Team Queue, however, is not so well known, though it occurs often in everyday life. At l

redis 学习 四 队列

<?php /** * redis实战 * * 利用列表list实现简单队列 * * @example php cache.php */ header('content-type:text/html;chaeset=utf-8'); $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); // 进队列 $userId = mt_rand(000000, 999999); $redis->rpush('QUEUE_NAME',j

构建队列,数组版本

队列作为基本的数据结构,是每个coder所必须掌握的. 队列在逻辑上就像是一条打饭的长队,排在前面的先打到饭(先进先出). 这里用一个数组用以构造一个队列,并设置两个指向,head指向队首,tail指向队尾,初始状态是head与tail指向同一位置(队列为空) 队列有两个操作:入队与出队. 1.入队:对比打饭排队的场景,新来的人排在后面,这是队尾tail需向后移一位. 2.出队:已经打好饭的人就可以出去了,这时队头也需向后移一位,让后面的人成为队头. 注意: 当head与tail都移到数组末端,

链队列代码及应用

链队列代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int ElemType; typedef struct Qnode{ int

caffe数据读取的双阻塞队列说明

caffe的datareader类中 class QueuePair { public: explicit QueuePair(int size); ~QueuePair(); BlockingQueue<T*> free_; BlockingQueue<T*> full_; DISABLE_COPY_AND_ASSIGN(QueuePair); }; 这个就是双阻塞队列,先将free队列填充到最大长度,然后按照如下规则: 1,每当生产者push时,先将full队列pop,如果fu

线性结构的常见应用之一 队列

定义:一种可以实现"先进先出"的存储结构 分类 链式队列 --  用链表实现 静态队列 --  用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列 2.循环队列需要几个参数来确定   需要两个参数来进行确定:front   rear 3.循环队列各个参数的含义 2个参数在不同的场合有不同的含义 建议初学者先记住,后面再想 1).队列初始化 front 和 rear 的值都是零 2).队列非空 front 代表的是队列的第一个元素 rear 代表

阻塞队列和生产者-消费者模式

阻塞队列提供了可阻塞的put和take方法.如果队列满了put将阻塞到有空间可用,如果队列为空,take将阻塞到有元素可用.队列可以是有界和无界的,无界的队列put将不会阻塞. 阻塞队列支持生产者消费者模式,该模式将找出需要完成的工作,和执行工作分开.生产者-消费者模式能简化开发过程,因为消除了生产者和消费者之间的代码依赖性,此外,该模式还将生产数据的过程和使用数据的过程解耦开来. 在基于阻塞队列构建的生产者-消费者设计中个,当数据生成时,生产者把数据放入队列,当消费者处理数据时,将从队列中获取