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

来源:互联网 发布:淘宝代销分账在哪找呢 编辑:程序博客网 时间:2024/05/21 08:56

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

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

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


算法复杂度:空


代码:

#include <cstdio>#include <queue>#include <algorithm>#include <cstring>using namespace std;#define MAX_N 105struct 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--) {// initint jobs[MAX_N];queue<SNode> que;int n, target;memset(jobs, 0, sizeof(jobs));while (!que.empty()) {que.pop();}// enterscanf("%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;}// sortsort(jobs, jobs + MAX_N, cmp);// dobool 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);}}//outputprintf("%d\n", count);}return 0;}int cmp(int a, int b){return a > b;}


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

#include <cstdio>#include <queue>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--) {//initint num, target;scanf("%d%d", &num, &target);priority_queue<Jobs> pque;while (!pque.empty()) {pque.pop();}//enterfor (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));}}//outputfor (int i = 1; i <= num; i++) {if (pque.top().target) {printf("%d\n", i);}pque.pop();}}return 0;}

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

原创粉丝点击