求助站外题
  • 板块学术版
  • 楼主Officer
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/17 21:57
  • 上次更新2024/4/18 14:02:15
查看原帖
求助站外题
872386
Officer楼主2024/4/17 21:57

题目描述

通常一个办公室只配备一台打印机,如果同时有很多打印任务,打印机就会非常忙碌。我们一般称等待打印的任务为打印队列,正常情况下,打印队列是按照先来先服务的原则进行打印的,但有时待打印的内容比较重要,会改变原有的打印顺序。

下面有这样一个打印队列,定义一个打印任务优先级:从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


*/

2024/4/17 21:57
加载中...