题目大意就是给出一个长度为n的打印任务队列,每个任务有优先级。每次从队列头得到一个任务,如果它是剩余任务中优先级最高的,则打印它,否则放到队列尾。求出其中某个特定任务是第几个被执行的。
n <= 100.
题目分析:这是一题模拟题,只要模拟出运足场景即可。
#include<iostream>
#include<queue>
#include<stdlib.h>
#include<memory.h>
using namespace std;
int a[100];
int cmp(const void* a , const void *b)
{
return *(int*)a-*(int*)b;
}
struct job
{
job(int i, int p){
id = i;
pri = p;
}
int id;
int pri;
};
int main()
{
int cas;
int target;
int num;
queue<job> jobs;
cin >> cas;
while(cas--)
{
cin >> num >> target;
memset(a, 0, sizeof(a));
for(int i = 0; i < num; ++i)
{
int t;
cin >> t;
jobs.push(job(i,t));
a[i] = t;
}
qsort(a, num, sizeof(int), cmp);
int p = num-1;
int c = 0;
while(true)
{
if(jobs.front().pri == a[p]) /*若队列头的任务的优先级最高*/
{
if(jobs.front().id == target)/*若队列头的任务就是要求的任务,则输出,结束程序*/
{
cout << c+1 << endl;
break;
}
else
{
c++; /*如果队列头的任务优先级是最高,但不是所求的任务,则pop出任务*/
jobs.pop();
p--;
}
}
else
{
jobs.push(jobs.front());/*入股队列头的任务优先级不是最高,则把该任务放到队列的最尾*/
jobs.pop();
}
}
while(!jobs.empty())
jobs.pop(); /*清空队列*/
}
}