这道题目也是一道简单的模拟题目,如果队列中存在比队首优先级高的元素,就把队首放到队尾,很简单。不过由于操作比较多,这里用数组来模拟实现队列,分别用fir和rear表示队首和队尾编号即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
// freopen("input.txt","r",stdin);
int w,t,n,m,a[10000],fir,rear;
scanf("%d",&w);
for(int q=1;q<=w;q++)
{
t=0;
scanf("%d%d",&n,&m);
fir=0;
rear=n-1;
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int oks=0;
while(!oks){
int temp=a[fir];
for(i=fir;i<=rear;i++)
{
if(a[i]>temp){//将队首任务移动到队尾
if(fir==m) m=rear+1;
a[++rear]=a[fir++];
break;
}
else if(i==rear){//打印队首任务
t++;
if(fir==m){
oks=1;
break;
}
fir++;
}
}
}
printf("%d\n",t);
}
return 0;
}
最近有重来做这道题,发现更优化的算法,直接利用stl模板库中的queue和priority_queue模拟打印队列即可。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct task{
int num,level;
bool operator<(const task& a) const{
return level<a.level;
}
};
int main()
{
// freopen("input.txt","r",stdin);
int n,i;
cin>>n;
while(n--){
queue<task> q;
priority_queue<task> qq;
int m,p;
cin>>m>>p;
task a;
for(i=0;i<m;i++){
cin>>a.level;
a.num=i;
q.push(a);
qq.push(a);
}
int ans=0;
while(true){
if(qq.top().level==q.front().level){
ans++;
a=q.front();
qq.pop();
q.pop();
if(a.num==p) break;
}
else{
a=q.front();
q.pop();
q.push(a);
}
}
cout<<ans<<"\n";
}
return 0;
}