zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    ZOJ 1002 Fire Net (火力网)
    UVa OJ 117 The Postal Worker Rings Once (让邮差只走一圈)
    UVa OJ 118 Mutant Flatworld Explorers (变体扁平世界探索器)
    UVa OJ 103 Stacking Boxes (嵌套盒子)
    UVa OJ 110 MetaLoopless Sorts (无循环元排序)
    第一次遇到使用NSNull的场景
    NSURL使用浅析
    从CNTV下载《小小智慧树》
    NSDictionary and NSMutableDictionary
    Category in static library
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/6849622.html
Copyright © 2011-2022 走看看