sicily 1443.Printer Queue

题目大意:
n给出一个长度为n的打印任务队列,每个任务有优先级。每次从队列头得到一个任务,如果它是剩余任务中优先级最高的,则打印它,否则放到队列尾。求出其中某个特定任务是第几个被执行的。
策略:
n使用队列直接模拟。
n取出队列头判断是否打印,如果打印则已打印任务数加一。
直到特定的任务完成,输出答案


#include 
#include 
#include 
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 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;
}                                 


你可能感兴趣的:(ACM)