#P13145. [GCJ 2018 #2] Falling Balls

    ID: 12966 远端评测题 10000ms 1024MiB 尝试: 0 已通过: 0 难度: 5 上传者: 标签>贪心2018Special JudgeGoogle Code Jam

[GCJ 2018 #2] Falling Balls

Description

某种玩具由一个有 22 列或更多列、11 行或更多行的网格组成,网格的每个格子中要么放有一个 \\backslash 斜坡,要么放有一个 // 斜坡,要么为空。最左边和最右边的两列始终为空,最底下一行也始终为空。小球会从最顶上一行的每一列各投放一个,并垂直下落,遇到斜坡会滑动。为了防止小球卡住,任意一个放有 \\backslash 斜坡的格子左侧,绝不会紧挨着一个放有 // 斜坡的格子。

当一个小球从顶行落下时,它的移动规则如下:

  • 如果小球当前在一个空格子中,则会直接落到正下方的格子,除非已经在最底行,此时小球不再移动。
  • 如果小球当前在一个放有 \\backslash 斜坡的格子中,则会落到右下方的格子。
  • 如果小球当前在一个放有 // 斜坡的格子中,则会落到左下方的格子。

为了完整展示这个机制,用户会在每一列的顶行各投放一个小球。小球之间互不影响,一个格子中可以有多个小球。

你的朋友有这样一个玩具,列数为 CC,行数未知。他在每一列的顶行各投放了一个小球,等所有小球都停止移动后,统计了每个底行格子里最终有多少个小球,并把这个结果告诉了你……但你怀疑他可能记错了。你能否构造出一个满足这些结果的布局,并且使用尽可能少的行数?或者判断根本不存在这样的布局?

例如,如果你朋友报告的底行结果是 3 0 0 2 0 13\ 0\ 0\ 2\ 0\ 1,一种可能的解法如下(注意不要求斜坡数量最少,也不要求每个斜坡都必须影响小球的路径):

./\\...
./\.\/.
.......

下图展示了小球在该网格中的下落路径:

Input Format

第一行输入测试用例数 TT。接下来有 TT 组测试数据。每组数据第一行为一个整数 CC,表示朋友的玩具有多少列。接下来一行有 CC 个整数 BiB_i,第 ii 个整数表示朋友统计的底行从左到右第 ii 个格子里最终有多少个小球。

Output Format

对于每组测试数据,输出一行 Case #x: y,其中 xx 是测试编号(从 11 开始),yy 是你构造的布局所需的最少行数,或者如果不存在这样的布局则输出 IMPOSSIBLE。如果 yy 不是 IMPOSSIBLE,则接下来输出 yy 行,依次表示你构造的玩具布局的每一行,从上到下。用 . 表示空格子,\/ 分别表示对应的斜坡。布局必须满足题目中的所有规则。

3
4
1 1 1 1
3
0 2 1
6
3 0 0 2 0 1
Case #1: 1
....
Case #2: IMPOSSIBLE
Case #3: 3
.//\..
./\./.
......

Hint

样例解释

注意,最后一个样例不会出现在测试集 1 中。

对于样例 1,唯一的有效解法如下(必须至少有一行,增加更多行会导致行数不最少。底行不能有任何斜坡):

....

对于样例 2,没有办法阻止最左边的小球直接落到底部,因为那一列不能放斜坡。

样例 3 就是题目描述最后给出的例子。注意,下面这个布局是非法的,因为它有多余的行数,左、右边界和底行都放了斜坡,而且出现了 // 斜坡左侧紧挨着 \\backslash 斜坡的情况:

\\..\/
../.\/
./../.
..../.

数据范围

  • 1T1001 \leq T \leq 100
  • 0BiC0 \leq B_i \leq C,对所有 ii 均成立。
  • 所有 BiB_i 之和等于 CC

测试集 1(5 分,公开)

  • 2C52 \leq C \leq 5

测试集 2(12 分,隐藏)

  • 2C1002 \leq C \leq 100

由 ChatGPT 4.1 翻译