uva12100 Printer Queue (队列模拟, 据说是优先队列,错了)

题意:给你打印任务的数量, 目标打印任务的序号, 目前的打印队列。

  如果队头是目前最重要的任务, 则打印, 否则放回队尾。 问, 目标打印任务是第几个打印的。

思路:用队列模拟打印任务队列, 每个元素是带有{int 重要性、bool 是否是目标打印任务}的结构体。然后按照题意去模拟便是。 关键在于如何判断队头任务 是目前最重要的任务。 只要在输入的时候把重要性另存在一个max[]数组里, 然后把这个数组从大到小排序, 每打印一个,下标后移一位。 下标指向的 便是目前最大的。(最后我会说下为什么优先队列不行)


算法复杂度:空


代码:

#include 
#include 
#include 
#include 
using namespace std;

#define MAX_N 105

struct SNode 
{
	SNode(int pri = 0, bool tar = false) {
		priority = pri;
		target = tar;
	}
	int priority;
	bool target;
};

int cmp(int, int);

int main()
{
	int cases;
	scanf("%d", &cases);

	while  (cases--) {
		// init
		int jobs[MAX_N];
		queue que;
		int n, target;
		memset(jobs, 0, sizeof(jobs));
		while (!que.empty()) {
			que.pop();
		}

		// enter
		scanf("%d%d", &n, &target);
		for (int i = 0; i < n; i++) {
			int priority;
			scanf("%d", &priority);

			if (i == target) {
				que.push(SNode(priority, true));
			} else {
				que.push(SNode(priority, false));
			}
			jobs[i] = priority;
		}

		// sort
		sort(jobs, jobs + MAX_N, cmp);

		// do
		bool ok = false;
		int count = 0;
		int *p = jobs;
		while (!ok) {
			SNode front = que.front();
			que.pop();
			if (front.priority == *p) {
				count++;
				p++;
				if (front.target) {
					ok = true;
				}
			}else {
				que.push(front);
			}
		}

		//output
		printf("%d\n", count);
	}

	return 0;
}

int cmp(int a, int b)
{
	return a > b;
}


那为什么优先队列不行呢? 因为优先队列各个元素之间的相对位置是不变的。

#include 
#include 
using namespace std;

struct Jobs
{
	Jobs(int pri = 0, bool tar = false) {
		priority = pri;
		target = tar;
	}
	friend bool operator < (Jobs a, Jobs b) {
		return a.priority < b.priority;
	}
	int priority;
	bool target;
};

int main()
{
	int cases;
	scanf("%d", &cases);
	while (cases--) {
		//init
		int num, target;
		scanf("%d%d", &num, &target);
		priority_queue pque;
		while (!pque.empty()) {
			pque.pop();
		}
		

		//enter
		for (int i = 0; i < num; i++) {
			int priority;
			scanf("%d", &priority);

			if (i == target) {
				pque.push(Jobs(priority, true));
			}else {
				pque.push(Jobs(priority, false));
			}
		}

		//output
		for (int i = 1; i <= num; i++) {
			if (pque.top().target) {
				printf("%d\n", i);
			}
			pque.pop();

		}
	}

	return 0;
}

样例3就过不了啦~ 9输出去之后, 都是1. 而目标任务 一开始就排在第一位, 所以优先队列会把这个1top()出来。 当然, 结果是错的啦~

你可能感兴趣的:(线性表)