UVA12100 打印队列 Printer Queue

题意描述

学生会里只有一台打印机,但是有很多文件需要打印,因此打印任务不可避免地需要等待。有些打印任务比较急,有些不那么急,所以每个任务都有一个1~9间的优先级,优先级越高表示任务越急。

打印机的运作方式如下:首先从打印队列里取出一个任务J,如果队列里有比J更急的任务,则直接把J放到打印队列尾部,否则打印任务J(此时不会把它放回打印队列)。 输入打印队列中各个任务的优先级以及所关注的任务在队列中的位置(队首位置为0),输出该任务完成的时刻。所有任务都需要1分钟打印。例如,打印队列为{1,1,9,1,1,1},目前处于队首的任务最终完成时刻为5。

输入T 接下来T组数据 每组数据输入N,TOP。接下来N个数,TOP代表队列首

输入

3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

输出

1
2
5
思路:

思路一: 1.初始化:首先可以搞一个结构体来存储数据的起始位置和优先级,然后把这些节点放到队列中,同时用一个数组来存放优先级.
2. 然后开始进行处理:先对优先级数组进行排序.然后每次从队列中获取对头元素判断优先级是否小于优先级队列中标记处的优先级,如果小于则直接放到队列尾部,处理下一个;如果等于且不是要查找的元素,则执行该任务,计时.如果优先级等于优先级数组中标记处的优先级且是自己所关注的任务,则执行该任务,然后结束.

思路二: 本题也可利用两个数组和一个队列来完成,一个数组来当做优先级数组,另外一个存储原始数据,然后队列来存储对应数据的索引(也就是用索引来指代数据),然后也是从前往后进行判断,判断时索引也就是位置.可以通过数组获取其优先级,然后与其优先数组进行比较…思路和上面差不多.

代码1
#include<bits/stdc++.h>
using namespace std;
struct Q {
	int v;//优先级 
	int x;//记录位置. 
	Q(int a = 0, int b = 0) :v(a), x(b) {};//构造方法进行初始化 
};
vector<int> prior;//存放优先级 
int n, m, w, val, k, total;//k:用于prior中索引,total用于计算时间 
queue<Q> que;
int main()
{
	cin >> n;
	while (n--) {
		while (!que.empty()) {
			que.pop();
		}
		prior.clear();
		k = 0;
		total = 0;
		cin >> m >> w;
		for (int i = 0; i < m; i++) {//初始化队列 
			cin >> val;
			prior.push_back(val);
			que.push(Q(val, i));
		}
		sort(prior.begin(), prior.end(), greater<int>());
		while (que.size() > 0) {
			if (que.front().v == prior[k]) {
				if (que.front().x == w) {
					total++;
					break;
				}
				else {
					que.pop();
					total++;
					k++;
				}
			}
			else {
				que.push(que.front());
				que.pop();
			}
		}
		cout << total << endl;
	}
	return 0;
}
代码2
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int main()
{
	
	int t, n, top;
	cin >> t;
	while(t--)//t组测试
	{
		int num;
		queue<int> q;
		vector<int> v1,v2;
		cin >> n >> top;
		for (int i = 0; i < n; i++)//每组测试数据初始化
		{
			cin >> num;
			q.push(i);
			v1.push_back(num);
			v2.push_back(num);
		}
		int w = 0, cur,k=0;
		sort(v2.begin(), v2.end(), greater<int>());//降序
		while (!q.empty())
		{
			cur = q.front();
			//1.取出队列中对头任务判断是否是最紧急的,如果不是就放在最后;
			//2.如果是最高的,就打印并判断是否是自己打印的那个文件   这个题不能用一个数组和一个队列写,因为优先级可能有多个相同的.这样没法区分,应该再搞一个数组,通过索引进行区分.
			//3.如果不是自己打印的文件但优先级最高则打印并计时然后继续判断,如果是则计时并结束\.
			if (v1[cur] == v2[w])//判断当前是不是最紧急的 
			{
				if (cur == top)
				{
					k++;//计时
					break;
				}
				else {
					q.pop();
					w++;//优先级索引后移
					k++;
				}
			}
			else {//不是最高优先级,放到队列最后
				q.pop();
				q.push(cur);
			}
		}
		cout << k << endl;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的大李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值