poj 1281(简单模拟题)

      题意:进程模拟。设有一个容器,对这个容器有下面四种操作:

                 a x:将一个花费为x的进程放入容器;

                 r:根据manager policy 取出花费最大还是最小的进程;

                 p i:修改manager policy ,i只有两种取值,即1和2;

                 e:结束模拟。

                 另外,manager policy 初始值是1,。并且,1代表取出最大花费的进程,2代表取出最小花费的进程。

                注意:结束一个模拟后要多输出一个回车,就因为这个PE了一次。。。。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
const int M=1010;
const int N=11000;
bool g[N][N],vis[N];
int n,m,ans,match[N];
int l[N],q[N],len;
int query(int p)
{
    int t=0;
    for (int i=1;i<len;i++){
        if (p==1)
        {
            if (q[i]<q[t]) t=i;
        }
        else {  if (q[i]>q[t]) t=i; }
    } int r=q[t];
    for (int i=t+1;i<len;i++) q[i-1]=q[i];
    len--;
    return r;
}
int main()
{
    char c;
    int p=1;
    int que[N];
    while(~scanf("%d%d",&n,&m))
    {
        int top=0;
        for (int i=0;i<m;i++) scanf("%d",l+i);
        int k,j;
        p=1;    k=j=len=0;
        while(cin>>c && c!='e'){
            if (c=='a'){
                scanf("%d",q+len); len++;
            }
            else if (c=='r'){
                if (len<=0) { printf("-1\n"); }
                k++;
                int t=query(p);
                if (l[j]==k){
                    j++;
                    que[top++]=t;
                }
            }
            else if (c=='p'){
                scanf("%d",&p);
            }
            else break;
        }
        for (int i=0;i<top;i++) printf("%d\n",que[i]); printf("\n");
    }
}



/*
100
5
1 2 3 4 5
a 10
a 13
a 9
r
r
a 7
a 6
r
p 2
r
r


*/










阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页