算法训练营:提高篇(全彩版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

训练2 并行处理

题目描述(POJ1281):并行处理中的编程范型之一是生产者/消费者范型,可以用具有管理者进程和多个客户进程的系统来实现。客户可以是生产者、消费者等,管理者跟踪客户进程。每个进程都有成本(1~10 000的正整数)。具有相同成本的进程数量不能超过10 000。队列根据请求的类型进行管理,如下所述。

· a x:将成本为x的进程添加到队列中。

· r:根据当前管理者策略从队列中删除进程(若可能)。

· p i:执行管理者策略i,其中i是1或2。1表示删除最小成本的进程;2表示删除最大成本的进程。默认的管理者策略为1。

· e:结束请求列表。

只有删除的进程在删除列表中时,管理者才会输出该进程的成本。编写一个程序来模拟管理者进程。

输入:输入的每个数据集都有以下格式。

· 进程的最大成本。

· 删除列表的长度。

· 删除列表,即待查询的删除进程列表。例如“1 4”表示查询第1个和第4个删除的进程的成本。

· 请求列表。每个请求列表各占一行。

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

输出:若删除的进程在删除列表中,并且此时队列不为空,则单行输出删除的进程的成本。若队列为空,则输出-1。以空行分隔不同数据集的结果。

1.算法设计

因为可能有多个相同的成本,所以可以用multiset解决。

(1)用vis[]数组标记删除列表要显示的序号。

(2)默认的管理者策略,p=1。

(3)读入字符,判断并执行相应的操作。

(4)进行删除操作时,若队列为空,则输出-1;否则判断管理者策略,若p=1,则删除最小成本的进程,否则删除最大成本的进程。若删除的进程在删除列表中,则输出该进程的成本。

2.算法实现