题意:进程模拟。设有一个容器,对这个容器有下面四种操作:
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
*/