POJ 3125 Printer Queue(队列,水题)

题意:有多组数据,每组数据给出n,m,n表示需要打印的文件个数,m表示要打印的目标位置(m为0~n-1)。
    接下来给出n个数,第i个值对应第i-1个位置的优先级大小。
    打印规则如下:
    将队列中的第一个打印工作J从队列中取出;
    如果在队列中有优先级高于J的打印工作,则不打印J,将J移到队列最后端;
    否则打印J。
    每打印一个需要1分钟,问到目标文件被打印完成需要多少分钟。

 

#include <iostream>
#include <stdio.h>
#include <stack>
#include <string.h>

using namespace std;
const int maxn=110;
int q[maxn];  //模拟的队列
int t,n,m;
int first,rear; //头指针和尾指针
int main()
{
    scanf("%d",&t);
    while(t--){
        //maxv为队列中的最大优先级,ans为最后输出目标文件所需要的时间
        int maxv=0,ans=0;
        first=rear=0;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%d",&q[i]);
            maxv=(q[i]>maxv)?q[i]:maxv;
        }
        rear=n-1;
        while(1){
            //如果队首的优先级不是最大的,那么将它移到队列末尾
            if(q[first]<maxv){
                rear=(rear+1)%n;
                q[rear]=q[first];
                //如果是要打印的目标文件,那么更新目标文件的位置m
                if(first==m)
                    m=rear;
                first++;
                first%=n;
            }
            else{
                //队首的优先级最大,则打印队首文件,如果为目标文件,则直接退出循环。
                ans++;
                if(first==m)
                    break;
                first++;
                first%=n;
            }
            int point=first;
            maxv=0;
            //找出剩下队列中的最大优先级
            while(point!=rear){
                maxv=(q[point]>maxv)?q[point]:maxv;
                point=(point+1)%n;
            }
            maxv=(q[point]>maxv)?q[point]:maxv;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

posted @ 2013-09-26 16:19  辰曦~文若  阅读(1406)  评论(0编辑  收藏  举报