您的位置:首页 > 产品设计 > UI/UE

POJ 3125 Printer Queue(队列,水题)

2013-09-26 16:19 435 查看
题意:有多组数据,每组数据给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: