题意:给出一串打印的优先级,如果打印i点但是后面有比他优先级高的,那么就将i点放到最后。如果后面没有比当前点优先级高的,则打印。已知打印耗时1,移动是瞬间完成。
思路:使用stl 的list,直接按照题意进行模拟。flag[i]存放的是优先级比i大的元素的个数。
#include <cstdio>
#include <list>
using namespace std;
int T,n,m,p;
int flag[10];
list<int> li;
void move(){
int tmp = li.front();
li.pop_front();
li.push_back(tmp);
}
int main(){
scanf("%d",&T);
while(T--){
int x,res = 1;
for(int i = 0;i<10;i++)
flag[i] = 0;
li.clear();
scanf("%d %d",&n,&m);
for(int i = 0;i<n;i++){
scanf("%d",&x);
flag[x-1]++;
if(i==m){
p = x;
x = 10;
}
li.push_back(x);
}
for(int i = 8;i>=1;i--)
flag[i] += flag[i+1];
while(!li.empty()){
int tmp = li.front();
if(tmp == 10){
if(!flag[p]){
printf("%d\n",res);
break;
}
move();
}else if(flag[tmp]){
move();
}else{
int tmp = li.front();
for(int i = tmp-1;i>=1;i--)
flag[i] --;
li.pop_front();
res++;
}
}
}
return 0;
}