并行处理中的编程范式之一是生产者/消费者范式,可以使用具有“管理者”进程和几个“客户端”进程的系统来实现。客户可以是生产者、消费者等。经理会跟踪客户流程。每个过程通过其成本来识别,该成本是范围1内的严格正整数。。10000。相同成本的流程数不能超过10000。队列根据以下三种类型的请求进行管理:
a x-将成本为x的过程添加到队列中;
r-如果可能,根据当前管理器策略从队列中删除进程;
p i-执行经理的策略i,其中i为1或2。默认管理器策略为1
e-结束请求列表。
有两种管理器策略:
1-删除最低成本流程
2-删除最大成本流程
只有当删除的进程的序号在删除列表中时,管理员才会打印删除进程的成本。
你的工作是编写一个模拟经理流程的程序。
输入
输入来自标准输入。输入中的每个数据集具有以下格式:
流程的最大成本
删除列表的长度
删除列表-将显示的已删除进程的序号列表;例如,1 4表示将显示第一个和第四个删除的过程的成本
每个请求的列表都在单独的行中。
每个数据集都以一个e请求结束。数据集由空行分隔。
输出
如果移除请求的序号在列表中且此时队列不为空,程序将在标准输出上打印每个被移除进程的成本。如果队列为空,程序将打印-1。结果打印在单独的行上。空行分隔不同数据集的结果。
下面给出了一个示例:
Sample
Input
5
2
1 3
a 2
a 3
r
a 4
p 2
r
a 5
r
e
Output
2
5
思路
用位集合记录删除列表,只有当删除的进程的序号在删除列表中时,才会打印删除进程的成本。
利用多重集合的性质,通过迭代器对最大元素和最小元素进行操作。
AC代码
#include <iostream>
#include <set>
#include <bitset>
#define AUTHOR "HEX9CF"
using namespace std;
int main()
{
int maxX, delLen, f = 0;
while (cin >> maxX >> delLen)
{
if (f)
{
cout << endl;
}
int cnt = 0;
int p = 1;
multiset<int> Ms;
bitset<10005> delList;
delList.reset();
// cout << maxX << " " << delLen << endl;
for (int j = 0; j < delLen; j++)
{
int t;
cin >> t;
delList[t - 1] = 1;
}
while (1)
{
char in;
in = getchar();
if ('e' == in)
{
break;
}
switch (in)
{
case 'a':
int x;
cin >> x;
Ms.insert(x);
break;
case 'r':
if (1 == p)
{
multiset<int>::iterator it = Ms.begin();
if (delList[cnt])
{
if (Ms.empty())
{
cout << -1 << endl;
break;
}
else
{
cout << *it << endl;
}
}
Ms.erase(it);
cnt++;
}
else
{
multiset<int>::iterator it = Ms.end();
it--;
if (delList[cnt])
{
if (Ms.empty())
{
cout << -1 << endl;
break;
}
else
{
cout << *it << endl;
}
}
Ms.erase(it);
cnt++;
}
break;
case 'p':
cin >> p;
break;
}
}
f = 1;
}
return 0;
}