UVA 12100 Printer Queue(算法竞赛入门经典,stl, 优先级队列)

算法竞赛入门经典,stl, 优先级队列
题目意思:
一台打印机,有一个打印序列,表示各个打印任务的优先级。然后,每次要打印当前任务时候,看看队列中
后面是否有任务的优先级更紧急,如有,就把当前的任务加入到队列的末尾。否则,打印当前的队列。
本题要点:
1、使用 队列 queue ,和 priority_queue 来模拟。用数组 prio_num[i] 表示优先级为i的有多少个
队列 queue 存放的是各个打印任务,priority_queue 存放的是所有的优先级,
然后堆顶 top 存放的都是最大的优先级。 不断地查看 queue 的队列首位的优先级,看看是否等于堆顶。等于就打印,
并且把数组 prio_num 对应的值 prio_num[top]–, 如果 prio_num[top] == 0, 从优先队列中删除。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int MaxN = 110;
int p[MaxN];
int prio_num[11];	//prio_num[i] 表示优先级为i的有多少个
int T, n, m;

struct print
{
	int priority;	//优先级
	int index;		//第几位
};

void solve()
{
	queue<print> q;
	priority_queue<int> pq;
	for(int i = 0; i < 10; ++i)
	{
		if(prio_num[i])	
		{
			pq.push(i);
		}
	}
	print pr;
	for(int i = 0; i < n; ++i)
	{
		pr.index = i, pr.priority = p[i];
		q.push(pr);
	}
	int out = -1, ans = 0;
	while(out != m)
	{
		int top = pq.top();
		print fro = q.front();
		while(fro.priority != top)
		{
			q.pop();
			q.push(fro);
			fro = q.front();
		}
		out = fro.index;
		q.pop();
		++ans;
		prio_num[top]--;
		if(prio_num[top] == 0)
		{
			pq.pop();
		}
	}
	printf("%d\n", ans);
}

int main()
{
	scanf("%d", &T);
	while(T--)
	{
		memset(prio_num, 0, sizeof prio_num);
		scanf("%d%d", &n, &m);
		for(int i = 0; i < n; ++i)
		{
			scanf("%d", &p[i]);
			prio_num[p[i]]++;
		}
		solve();
	}
	return 0;
}

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

/*
1
2
5
*/

猜你喜欢

转载自blog.csdn.net/qq_38232157/article/details/108309416