POJ 1281 MANAGER C++版

题目链接:http://poj.org/problem?id=1281

解释下题意,先输入最大的数,再输入最后查询移出数的个数,依次输入查询移出数的位置,后面就是循环的操作了;

  • a:加入一个数
  • p:设置p的值
  • r:删除一个数,p为1删除最小的数,p为2删除最大的数!
  • e:结束一个输入

我们以给出的例子来分析

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

最大值设为5,后面要查询两个数,分别是第1个和第3个,然后开始循环
a2a3—现在列表为2,3
r——p为1,删除最小的,现在列表为3,移出列表为2
a4—–现在列表为3,4,移出列表为2
p2—–p设为2
r——p为2,删除最大的,现在列表为3,移出列表为2,4
a5—–现在列表为3,5,移出列表为2,4
r——p为2,删除最大的,现在列表为3,移出列表为2,4,5
e——结束

然后输出第1个和第3个移出的,既2,5。

模拟题没什么好说的,他说什么你就干什么,利用数组inum记录查询的位置,inow记录现在数列里的数,idel记录删除的数,用inumx,inowx,idelx分别记录每个数组里的数的个数。话不多说看代码,很好理解。

代码如下:

::cpp
/***************************************
Problem: 1281        User: awq123
Memory: 700K        Time: 0MS
Language: C++        Result: Accepted
***************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

int cmp(int a,int b)
{
    return a>b;
}

int main()
{
    int inum[10000],inow[10000],idel[100000];
    int imax,i,p,inumx,inowx,idelx;
    char judge;
    while(cin>>imax>>inumx)
    {
        p=1,inowx=0,idelx=0;
        for(i=0;i<inumx;i++)
            cin>>inum[i];
        while(1)
        {
            cin>>judge;
            if (judge=='e')
                break;
            else if (judge=='a')
            {
                cin>>inow[inowx];
                inowx++;
            }
            else if (judge=='r')
            {
                if(p==1)
                    sort(inow,inow+inowx,cmp);
                else if(p==2)
                    sort(inow,inow+inowx);
                inowx--;
                idel[idelx]=inow[inowx];
                idelx++;
            }
            else if (judge=='p')
            {
                cin>>p;
            }

        }
        for (i = 0; i < inumx; i++)
        {
            if(inum[i]>idelx)
                cout<<-1<<endl;
            else
                cout<<idel[inum[i]-1]<<endl;
        }
        cout<<endl;
    }
}