算法竞赛入门经典,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
*/