QOJ.ac

QOJ

Límite de tiempo: 1 s Límite de memoria: 256 MB Puntuación total: 100

#3401. 组装服务

Estadísticas

在本题中,你需要模拟 $n$ 个服务程序 $P_1, P_2, \dots, P_n$ 的执行过程。每个程序由一系列整数描述:$T, I, in_1, in_2, \dots, in_I, O, out_1, out_2, \dots, out_O$,这意味着它需要 $T$ 个单位时间来执行,需要 $I$ 个输入变量(即 $in_1, in_2, \dots, in_I$),并在运行结束时设置 $O$ 个输出变量(即 $out_1, out_2, \dots, out_O$)。一个程序当且仅当所有这些输入变量都准备好(初始可用,或由其他程序设置)时才能启动。

想象你拥有一台超级计算机,可以根据需要并行执行任意数量的程序,并且每个变量都可以被多个程序同时读取和写入。你的任务是尽快计算出特定的“目标”变量。

假设有 4 个程序,如下表所示:

程序编号 时间 需要 产生
1 2 $X_1$ $X_2$
2 3 $X_1$ $X_3$
3 4 $X_2$ $X_4$
4 1 $X_3, X_4$ $X_5$

如果初始只有 $X_1$ 可用,则获得 $X_5$ 的最快时间为 7。

你还需要构造一个表达式,展示如何执行这些程序以达到最短时间。该表达式的语法是递归的:

  • 单个程序:$P_x$,其中 $1 \le x \le n$(例如 $P_2, P_{499}$ 等)。含义:立即执行该程序。该程序的结束标志着此表达式的结束。
  • 串行执行:$(S_1S_2\dots S_k)$,其中每个 $S_i$ 都是一个表达式。注意最外层的括号是强制性的。含义:执行表达式 $S_1$,然后在 $S_1$ 结束后立即执行 $S_2$,在 $S_2$ 结束后立即执行 $S_3$,以此类推,最后在 $S_{k-1}$ 结束后立即执行 $S_k$。表达式 $S_k$ 的结束标志着整个表达式的结束。
  • 并行执行:$(S_1|S_2|\dots|S_k)$,其中每个 $S_i$ 都是一个表达式。注意最外层的括号是强制性的。含义:同时执行表达式 $S_1, S_2, \dots, S_k$。最后一个完成的表达式的结束标志着整个表达式的结束。

上述示例的一种可能表达式是 $(((P_1P_3)|P_2)P_4)$。$(P_1P_2P_3P_4)$ 是不可接受的,因为在该表达式中,$X_5$ 在时间 10 才可用,晚于最优时间 7。

输入格式

最多有 100 组测试数据。每组数据以三个整数 $n, m, o$ 开始($1 \le n, m \le 500, 1 \le o \le m$)。程序数量为 $n$,变量数量为 $m$,目标变量为 $X_o$。变量编号为 1 到 $m$,程序编号为 1 到 $n$。下一行包含一个长度为 $m$ 的 01 字符串。如果第 $i$ 个字符为 1,则表示第 $i$ 个变量初始可用。保证目标变量在初始时不可用。接下来的 $n$ 行描述程序。每行以一个整数 $T$($1 \le T \le 100$)开始,表示执行时间,接着是一个整数 $I$,随后是 $I$ 个整数 $in_1, in_2, \dots, in_I$,如上所述,然后是一个整数 $O$,随后是 $O$ 个整数 $out_1, out_2, \dots, out_O$。$1 \le in_i, out_i \le m, 1 \le I, O \le 10$。最后一组测试数据后跟随 $n=m=o=0$,该行不应被处理。

输出格式

对于每组测试数据,打印案例编号和获得目标变量所需的总时间。如果无法获得目标变量,则打印 -1。

如果可以获得目标变量,则在同一行打印表达式。请确保打印一个有效的表达式,长度最多为 10,000 个字符,且每个程序最多打印一次。表达式内不应包含任何空格字符。

为了简化问题,允许某些程序在最优时间之后完成,只要目标变量在最优时间可用即可。你也可以打印冗余的括号(但要注意表达式长度)。如果不存在这样的表达式,则打印 "Can't do in serial-parallel.",不带引号。

在每组测试数据的输出后打印一个空行。

样例

输入 1

4 5 5 
10000 
2 1 1 1 2 
3 1 1 1 3 
4 1 2 1 4 
1 2 3 4 1 5 
1 2 1 
01 
31 1 2 1 1 
3 5 5 
10100 
3 1 1 1 2 
1 1 3 1 4 
3 2 4 2 1 5 
1 3 3 
100 
1 1 1 1 2 
0 0 0

输出 1

Case 1: 7 (((P1P3)|P2)P4) 
Case 2: 31 P1 
Case 3: 6 ((P1P3)|P2) 
Case 4: -1

说明

变量被设置后,它将永远保持可用。这就是为什么在第三个示例中 $P_3$ 可以被执行。

还要注意,第一个示例还有其他正确的表达式,例如 $((P_1P_3P_4)|P_2)$。你甚至可以打印 $(((P_1P_3)P_4)|P_2)$ 或 $((P_1(P_3P_4))|P_2)$。在本题中,它们中的任何一个都是可接受的。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.