题目描述
通常一个办公室只配备一台打印机,如果同时有很多打印任务,打印机就会非常忙碌。我们一般称等待打印的任务为打印队列,正常情况下,打印队列是按照先来先服务的原则进行打印的,但有时待打印的内容比较重要,会改变原有的打印顺序。
下面有这样一个打印队列,定义一个打印任务优先级:从1到9(级别9是最高的);打印时,先取出队首的一个打印任务J,如果队列中还有优先级比J高的任务K,则把J一直到K-1全部移动到队尾,并打印K;否则直接打印J,并继续下一个打印任务:继续从队首开始。
下面我们来模拟这个打印队列,给定一个打印序列,这个序列以优先级别给出(例如:1 1 9 1 1 1,说明有6个打印任务,并分别给出了每个任务的优先级),并假定每个打印任务花费1个单位时间,而且不会再有新的打印任务。计算要完成给定的一个任务所花费的时间。
输入
第一行为正整数t(≤100),表示测试数据组数;每组数据中,第一行为正整数n(≤100),表示任务数,整数k(0≤k≤n-1),表示指定的任务在下面一行中是第k个任务,从0下标开始;第二行为n个正整数序列pi,以空格隔开,分别表示每个任务的优先级,1≤pi≤9。
输出
对于每组数据,输出要完成指定的任务所花费的总时间。
样例输入
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
样例输出
1
2
5
#include<bits/stdc++.h>
using namespace std;
struct node
{
int a,i;
}a[10005];
int n,k,num[10005];
int main()
{
int T;
cin>>T;
while(T--)
{
int sum=0;
cin>>n>>k;
k++;
for(int i=1;i<=n;i++)
{
cin>>a[i].a;
a[i].i=i;
num[a[i].a]++;
}
for(int i=1;i<=n;i++)
{
int b=0;
for(int j=9;j>=1;j--)
{
if(num[j]!=0)
{
b=j;
break;
}
}
if(a[i].a<b)
{
for(int j=i;j<=n;j++)
{
if(a[j].a==b)
{
for(int z=1;z<j;z++)
{
a[z+n].a=a[z].a;
a[z+n].i=a[z].i;
a[z].a=0;
a[z].i=0;
}
for(int z=j;z<=n;z++)
{
a[z-j+1].a=a[z].a;
a[z-j+1].i=a[z].i;
}
int t=j;
while(a[1].a!=0)
{
for(int z=t;z<=t+n;z++)
{
swap(a[z],a[z-1]);
}
t--;
}
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i].a<<" ";
}
cout<<endl;
for(int i=1;i<=n;i++)
{
cout<<a[i].i<<" ";
}
cout<<endl;
for(int i=1;i<=n;i++)
{
if(a[i].i==k)
{
cout<<i<<endl;
}
}
}
return 0;
}
/*
1
4 2
1 2 3 4
*
4 3 2 1
*
1 2 3 4
2 3 4
1
1 2 3 4 5 6 7 8 9
1 1 1 1 0 0 0 0 0
*/