题意:有多组数据,每组数据给出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 ",ans); } return 0; }