PQUEUE - Printer Queue

题目描述

PQUEUE - Printer Queue_第1张图片

The only printer in the computer science students' union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output.

Because some jobs are more important than others, the Hacker General has invented and implemented a simple priority system for the print job queue. Now, each job is assigned a priority between 1 and 9 (with 9 being the highest priority, and 1 being the lowest), and the printer operates as follows.

  • The first job J in queue is taken from the queue.
  • If there is some job in the queue with a higher priority than job J, then move J to the end of the queue without printing it.
  • Otherwise, print job J (and do not put it back in the queue).

In this way, all those important muffin recipes that the Hacker General is printing get printed very quickly. Of course, those annoying term papers that others are printing may have to wait for quite some time to get printed, but that's life.

Your problem with the new policy is that it has become quite tricky to determine when your print job will actually be completed. You decide to write a program to figure this out. The program will be given the current queue (as a list of priorities) as well as the position of your job in the queue, and must then calculate how long it will take until your job is printed, assuming that no additional jobs will be added to the queue. To simplify matters, we assume that printing a job always takes exactly one minute, and that adding and removing jobs from the queue is instantaneous.

输入格式

One line with a positive integer: the number of test cases (at most 100). Then for each test case:

  • One line with two integers n and m, where n is the number of jobs in the queue (1 ≤ n ≤ 100) and m is the position of your job (0 ≤ m ≤ n-1). The first position in the queue is number 0, the second is number 1, and so on.
  • One line with n integers in the range 1 to 9, giving the priorities of the jobs in the queue. The first integer gives the priority of the first job, the second integer the priority of the second job, and so on.

输出格式

For each test case, print one line with a single integer; the number of minutes until your job is completely printed, assuming that no additional print jobs will arrive.

题意翻译

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

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

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

输入输出样例

输入 #1复制

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

输出 #1复制

1
2
5
#include
#include
#include
#include
#include
using namespace std;
const int N = 1e5 + 10;
int sum = 0,maxsum = 0;
int main()
{
	int t; cin >> t;
	while (t--)
	{
		queue> q;  //建立队列,first存的是一开始文档的位置,second存的是文档的优先级
		priority_queue, less> k;  //建立大根堆,存的是文档的优先级
		int n, m; cin >> n >> m;
		for (int i = 0; i < n; i++)  //读入数据
		{
			int num; cin >> num;
			q.push({ i,num });
			k.push(num);
		}

		int sum = 0;
		while (k.size())   //只要大根堆不为空就继续循环
		{
			int flag = 0;  //设置额外跳出循环的条件
			while (q.front().second != k.top()) {  //让队列和大根堆同步进行
				auto temp = q.front();
				q.pop();
				q.push(temp);
			}

			if (q.front().second == k.top()) {   //找到队列中优先级最高的文件并进行打印,时间加一
				if (q.front().first == m) flag = 1; //打印到相应的文件后时间加一,加完后就可以跳出循环了
				sum++;
				q.pop(); k.pop();
			}

			if (flag == 1) break;
		}
		cout << sum << endl;
	}
	return 0;
}

你可能感兴趣的:(算法)