没有什么特别的,就是按照题意进行模拟,代码有点长。。。
#include<cstdio>
#include<queue>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 222;
int n,t[10],q;
int Value[maxn];
/*
1 a = 1
2 print
3 lock
4 unlock
5 end
*/
struct Data{
int kind;
int aim;
int value;
Data(int x,int y,int z = 0){
kind = x;
aim = y;
value= z;
}
};
struct Pro{
vector<Data>q;
int now;
}arr[maxn];
deque<int>dq;
queue<int>eq;
void debug(){
for(int i = 0; i < n; i++){
printf("[%d]\n",i);
for(int j = 0; j < arr[i].q.size(); j++)
printf("%d %c %d\n",arr[i].q[j].kind,arr[i].q[j].aim,arr[i].q[j].value);
}
}
void solve(){
dq.clear();
while(!eq.empty()) eq.pop();
for(int i = 0; i < n; i++)
dq.push_back(i);
int islock = 0;
while(!dq.empty()){
int time = 0,i; //记录这个当前程序运行的时间
int now = dq.front();
dq.pop_front();
int have_finish = 0;
for(; arr[now].now < arr[now].q.size() && time < q; arr[now].now ++ ){
i = arr[now].now;
int kind = arr[now].q[i].kind;
//printf("-> %d %d %d\n",now,i,kind);
if(kind == 1){
int aim = arr[now].q[i].aim;
int value = arr[now].q[i].value;
Value[aim] = value;
}
else if(kind == 2){
int aim = arr[now].q[i].aim;
printf("%d: %d\n",now + 1,Value[aim]);
}
else if(kind == 3){ //锁住
if(!islock){ //没有锁住
}
else{
eq.push(now);
have_finish = 1;
break;
}
islock ++;
}
else if(kind == 4){
islock --;
if(!eq.empty()){
dq.push_front(eq.front());
eq.pop();
}
}
else if(kind == 5){
have_finish = 1;
break;
}
time += t[kind];
}
if(!have_finish){
dq.push_back(now);
}
}
}
int main(){
int T;
//printf("%d\n",'z');
scanf("%d",&T);
while(T--){
memset(Value,0,sizeof(Value));
scanf("%d",&n);
for(int i = 1; i <= 5; i++)
scanf("%d",&t[i]);
scanf("%d",&q);
for(int i = 0; i < n; i++){
char str[maxn];
arr[i].now = 0;
arr[i].q.clear();
while(true){
scanf("%s",str);
if(!strcmp(str,"end")){
arr[i].q.push_back(Data(5,0));
break;
}
else if(!strcmp(str,"print")){
scanf("%s",str);
arr[i].q.push_back(Data(2,str[0]));
}
else if(!strcmp(str,"lock")){
arr[i].q.push_back(Data(3,0));
}
else if(!strcmp(str,"unlock")){
arr[i].q.push_back(Data(4,0));
}
else{
int value;
scanf("%*s%d",&value);
arr[i].q.push_back(Data(1,str[0],value));
}
}
}
//debug();
solve();
if(T) printf("\n");
}
return 0;
}