模拟一下就好了,可以用Deque双端队列
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[] time = new int[129];
static int[] ch = new int[26];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int T = scan.nextInt();
while(T--!=0){
Arrays.fill(time, 0);
Arrays.fill(ch, 0);
int n = scan.nextInt();
int t1 = scan.nextInt();
int t2 = scan.nextInt();
int t3 = scan.nextInt();
int t4 = scan.nextInt();
int t5 = scan.nextInt();
int Q = scan.nextInt();
time['='] = t1;
time['i'] = t2;
time['c'] = t3;
time['l'] = t4;
time['d'] = t5;
scan.nextLine();
Deque<Program> wait = new LinkedList<>();
Queue<Program> stop = new LinkedList<>();
for(int i=1;i<=n;i++){
Program program = new Program();
program.number = i;
while(true){
String s = scan.nextLine();
program.code.add(s);
if("end".equals(s))break;
}
wait.add(program);
}
boolean isLock = false;
while(!wait.isEmpty()){
//System.out.println("1");
Program program =wait.poll();
int t = Q;
while(!program.code.isEmpty()){
if(t<=0){
wait.add(program);
break;
}
String s = program.code.peek();
if(s.charAt(2)=='c'){
if(isLock){
stop.add(program);
break;
}else{
isLock = true;
}
}
t-=time[s.charAt(2)];
program.code.poll();
if(s.charAt(2)=='='){
char c = s.charAt(0);
int num = Integer.parseInt(s.substring(4));
ch[c-'a'] = num;
}
if(s.charAt(2)=='d'){
break;
}
if(s.charAt(2)=='l'){
isLock = false;
if(!stop.isEmpty()){
wait.addFirst(stop.poll());
}
}
if(s.charAt(2)=='i'){
char c = s.charAt(6);
System.out.println(program.number+": "+ch[c-'a']);
}
}
}
if(T!=0){
System.out.println();
}
}
}
static class Program{
int number;
Queue<String> code = new LinkedList<>();
}
}