学网站制作多少钱/学计算机哪个培训机构好
【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(); //如果不是我们的任务,就poppq.pop(); //同时把这个任务的优先级数字去掉cnt++; //同时时间+1,证明打印完了这个任务}else break; //如果是我们的任务,结束输出}cout<<cnt<<endl;}return 0;
}