【2019.4.8】勇士锁定西部第一
对于每个打印任务,我们应该把“打印任务编号”和“任务优先级”对应起来,这样才方便我们确定队列中哪个是我们自己的任务
用struct node
存储一个任务:
typedef struct {
int id; //任务编号
int prio; //优先级
}node;
随后,我们需要做的是:比较【当前任务的优先级】和【队列中最高的优先级】谁高
由于队列queue
是无法遍历的,因此我们不能用遍历的方式取得【队列中最高的优先级】
但priority_queue
可以保证我们每次都能取到队首元素,用优先队列来存储所有任务的优先级挺合适
因此选择如下数据结构:
1、queue<node> q
:存储所有任务队列
2、priority_queue<int> pq
:存储所有任务的优先级的队列
#include <iostream>
#include <queue>
using namespace std;
typedef struct {
int id;
int prio;
}node;
queue<node> q;
priority_queue<int> pq;
int main()
{
//freopen("C:\\Users\\Summer\\Desktop\\input.txt", "r", stdin);
//freopen("C:\\Users\\Summer\\Desktop\\output.txt", "w", stdout);
int T;
cin>>T;
int n, m;
while(T--) {
//初始化
while(!q.empty()) q.pop();
while(!pq.empty()) pq.pop();
//输入
cin>>n>>m;
int j;
for(int i=0; i<n; i++) {
cin>>j;
//建立任务
node* n1 = (node*)malloc(sizeof(node));
n1->id = i;
n1->prio = j;
q.push(*n1); //将任务投入任务队列
pq.push(n1->prio); //将其优先级加入优先队列
}
int cnt = 1; //初始时间为1,是因为打印完我们的任务也需要1个单位时间
while(true) {
//当队首任务的优先级<队列中最高的优先级,循环此操作
while(q.front().prio < pq.top())
{
q.push(q.front()); //将队首任务放到队尾
q.pop();
}
//当队首元素成为队列中优先级最高的任务时,判断是不是我们的任务
if(q.front().id != m) {
q.pop(); //如果不是我们的任务,就pop
pq.pop(); //同时把这个任务的优先级数字去掉
cnt++; //同时时间+1,证明打印完了这个任务
}
else break; //如果是我们的任务,结束输出
}
cout<<cnt<<endl;
}
return 0;
}