题目描述
并行处理中的编程范式之一是生产者/消费者范例,可以使用具有“经理”过程和几个“客户”过程的系统来实施。客户可以是生产者,消费者等等。经理保留一些客户流程。每个进程由其严格正整数的成本来标识,范围为1..10000。具有相同成本的进程数不能超过10000.按照以下三种请求管理队列,如下所示:
有两个经理政策:
仅当删除的进程的序号位于删除列表中时,管理器才会打印已删除进程的成本。
你的工作是编写一个模拟经理流程的程序。
- ax - 将成本x加到队列中;
- r - 如果可能,根据当前管理器策略从队列中删除进程;
- 执行经理的政策i,其中i是1或2.默认经理政策是1
- e - 结束请求列表。
有两个经理政策:
- 1 - 删除最低成本过程
- 2 - 删除最高成本的过程
仅当删除的进程的序号位于删除列表中时,管理器才会打印已删除进程的成本。
你的工作是编写一个模拟经理流程的程序。
输入
输入来自标准输入。输入中的每个数据集具有以下格式:
每个数据集都以e请求结束。数据集由空行分隔。
- 过程的最大成本
- 删除列表的长度
- 删除列表 - 将要显示的已删除进程的序号列表; 例如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