问题1736--并行程序模拟

1736: 并行程序模拟

时间限制: 1 Sec  内存限制: 128 MB
提交: 4  解决: 3
[提交] [状态] [讨论版] [命题人:]

题目描述

你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行。每个程序包含不超过25条语句,格式一共有5种:
  var=constant(赋值);
  print  var(打印);
  lock;
  unlock;
  end。
变量用单个小写字母表示,初始值为0,为所有程序公有(因此在一个程序里对某个变量赋值可能会影响到另一个程序)。常数是小于100的非负整数。
每个时刻只能有一个程序处于运行态,其他程序均处于等待态。上述五种语句分别需要t1、t2、t3、t4、t5单位时间。运行态的程序每次最多运行Q个单位时间(成为配额)。当一个程序的配额用完之后,把当前语句(如果存在)执行完之后该程序会被插入一个等待队列中,然后处理器从队首取出一个程序继续执行。初始等待队列包含按输入顺序排列的各个程序,但由于lock和unlock语句的出现,这个序列可能会改变。
lock的作用是申请对所有变量的独占访问。lock和unlock总是成对出现,并且不会嵌套。lock总是在unlock的前面。当一个程序成功执行完lock指令后,其他程序一旦试图执行lock指令,就会马上被放到一个所谓的阻止队列的尾部(没有用完的配额就浪费了),当unlock指令执行完毕后,阻止队列的第一个程序进入等待队列的首部。

输入

输入以一行上的单个正整数开头,它本身指示随后出现的情况的数量,每种情况如下所述。 该行之后是空白行,并且在两个连续的输入之间也存在空白行。
输入文件的第一行包含七个由空格分隔的整数。 这些整数指定(按顺序):以下程序的数目,五个语句中的每一个的单位执行时间(按上面给出的顺序)以及构成时间量的时间单位数。 输入的其余部分由程序组成,这些程序根据上述规则由语句正确形成。
所有程序语句都从一行的第一列开始。 语句中出现的空白应被忽略。 与每个程序相关联的是基于其在输入数据中位置的标识号(第一个程序的ID = 1,第二个程序的ID = 2,依此类推)。

输出

对于每个测试用例,输出必须遵循以下描述。 两个连续案例的输出将由空白行分隔。
您的输出将包含打印语句在模拟过程中发生时所产生的输出。 当执行打印语句时,您的程序应显示程序ID,冒号,空格和所选变量的值。 来自单独的打印语句的输出应出现在单独的行上。
样本输入和正确的输出如下所示。

样例输入 Copy

3 1 1 1 1 1 1
a = 4
print a
lock
b = 9
print b
unlock
print b
end
a = 3
print a
lock
b = 8
print b 
unlock
print b
end
b = 5
a = 17
print a
print b
lock
b = 21
print b
unlock
print b
end

样例输出 Copy

1: 3
2: 3
3: 17
3: 9
1: 9
1: 9
2: 8
2: 8
3: 21
3: 21

来源/分类