【POJ 1281】MANAGER 题解(模拟+多重集合+位集合)

33 阅读2分钟

并行处理中的编程范式之一是生产者/消费者范式,可以使用具有“管理者”进程和几个“客户端”进程的系统来实现。客户可以是生产者、消费者等。经理会跟踪客户流程。每个过程通过其成本来识别,该成本是范围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;
}