题目大意:
n给出一个长度为n的打印任务队列,每个任务有优先级。每次从队列头得到一个任务,如果它是剩余任务中优先级最高的,则打印它,否则放到队列尾。求出其中某个特定任务是第几个被执行的。
策略:
n使用队列直接模拟。
n取出队列头判断是否打印,如果打印则已打印任务数加一。
直到特定的任务完成,输出答案
#include <iostream>
#include <stdlib.h>
#include <queue>
using namespace std;
typedef struct Event
{
int a;
int priority;
}Event;
int main()
{
int n;
cin >> n;
while(n--)
{
int number,position,count = 0;
Event e[101];
queue<Event> q;
int max_priority = 0;
int prio[10] = {0};
cin >> number >> position;
for(int i = 0;i < number;i++)
{
cin >> e[i].priority;
e[i].a = i;
q.push(e[i]);
if(e[i].priority > max_priority)//找出最大的优先级
max_priority = e[i].priority;
prio[e[i].priority]++;//统计各个优先级出现的个数
}
while(true)
{
Event current = q.front();
if(current.priority == max_priority)
{
count++;
prio[max_priority]--;
q.pop();
if(current.a == position)
break;
while(max_priority > 0 && prio[max_priority] == 0)
{
max_priority--;
}
}
else
{
Event temp = q.front();
q.pop();
q.push(temp);
}
}
cout << count << endl;
}
return 0;
}