管理manager

题目描述

并行处理中的编程范式之一是生产者/消费者范例,可以使用具有“经理”过程和几个“客户”过程的系统来实施。客户可以是生产者,消费者等等。经理保留一些客户流程。每个进程由其严格正整数的成本来标识,范围为1..10000。具有相同成本的进程数不能超过10000.按照以下三种请求管理队列,如下所示: 
  • ax - 将成本x加到队列中; 
  • r - 如果可能,根据当前管理器策略从队列中删除进程; 
  • 执行经理的政策i,其中i是1或2.默认经理政策是1 
  • e - 结束请求列表。 

有两个经理政策: 
  • 1 - 删除最低成本过程 
  • 2 - 删除最高成本的过程 

仅当删除的进程的序号位于删除列表中时,管理器才会打印已删除进程的成本。 
你的工作是编写一个模拟经理流程的程序。 

输入

输入来自标准输入。输入中的每个数据集具有以下格式: 
  • 过程的最大成本 
  • 删除列表的长度 
  • 删除列表 - 将要显示的已删除进程的序号列表; 例如1 4表示将显示第一个和第四个已删除进程的成本 
  • 请求列表中的每个请求都在一个单独的行中。 

每个数据集都以e请求结束。数据集由空行分隔。

输出

如果删除请求的序号在列表中并且此时队列不为空,程序将在标准输出上打印每个删除的进程的成本。如果队列为空,则程序打印-1。结果打印在单独的行中。空行分隔不同数据集的结果。 

以下是一个例子:

样例输入

5
2
1 3
a 2
a 3
r
a 4
p 2
r
a 5
r
e

样例输出

2
5

题目大意:

线程模拟。

ax——将一个花费为x的进程加到队列中

r——如果可能,按照当前管理者的策略,删除一个进程

p i ——执行管理者的策略i,其中i是1或者2,缺省值为1

e——请求列表终止

两个管理者的策略为:

1——删除最小耗费进程

2——删除最大耗费进程

 

输出指定的删除序列


算法实现:
#include <iostream>
#include <algorithm>
using namespace std;
int cmp1(int a,int b)
{
	return a>b;
} 
int cmp2(int a,int b)
{
	return a<b;
}
int main()
{
	int num;
	while(cin>>num&&num)
	{
		int p=1;
		int n;
		cin>>n;
		int a[1010]={0},b[1010]={0},c[2010]={0};//数组a用来记录输入数据 b用来记录输出第几位数据 c记录输出的数据
		int i;
		for(i=1;i<=n;i++)
		    cin>>b[i];
		int a1=1,b1=1,c1=1;
		char ch;
		i=0;
		while(cin>>ch,ch!='e')
		{
			if(ch=='a')
			{
				cin>>a[a1];
				a1++;
			}
			if(ch=='p')
			{
				cin>>p;
			}
			if(ch=='r')
			{
				if(a1==1)
				{
					c[c1]=-1;
					c1++;
				}
				else if(p==1)//删除最小进程 
				{
					sort(a+1,a+a1,cmp1);
					c[c1]=a[a1-1];
					c1++;
					a1=a1-1;
				}
				else if(p==2)//删除最大进程 
				{
					sort(a+1,a+a1,cmp2);
					c[c1]=a[a1-1];
					c1++;
					a1=a1-1;
				}
			}
		}
		for(i=1;i<=n;i++)
		cout<<c[b[i]]<<endl;
		cout<<endl;
	}
	return 0;
}
sort函数详情见 http://blog.csdn.net/sunshumin/article/details/37756027



猜你喜欢

转载自blog.csdn.net/qq_41486817/article/details/80683568