QOJ.ac

QOJ

时间限制: 1 s 内存限制: 256 MB 总分: 100

#17139. Diagonal Numbers

统计

Vasylko 得到了写有数字 $1$ 到 $n$ 的立方体。其中,有 $1$ 个立方体写着数字 $n$,$2$ 个立方体写着数字 $n-1$,依此类推,有 $n-1$ 个立方体写着数字 $2$,$n$ 个立方体写着数字 $1$。

他将这些立方体放置在一个没有顶边界的正方形框架中,使得所有立方体都位于从左上角到右下角的对角线下方。在左侧的第一列中,有 $n$ 个写着数字 $1$ 的立方体;在第二列中,有 $n-1$ 个写着数字 $2$ 的立方体……在第 $n$ 列中,有 $1$ 个写着数字 $n$ 的立方体。也就是说,在第 $i$ 列中,有 $n-i+1$ 个写着数字 $i$ 的立方体。

初始状态

Vasylko 想要重新排列它们,使得所有立方体都位于另一条对角线(副对角线)下方。因此,在自底向上的第一行中,应该有 $n$ 个写着数字 $1$ 的立方体;在第二行中,应该有 $n-1$ 个写着数字 $2$ 的立方体……在第 $n$ 行中,应该有 $1$ 个写着数字 $n$ 的立方体。也就是说,在第 $i$ 行中,应该有 $n-i+1$ 个写着数字 $i$ 的立方体。

最终状态

他还决定,他只能将立方体从某一列的顶部移动到另一列的顶部(不一定相邻)。请帮助他以最有效的方式完成这一操作——找到他所需的最少移动次数,并输出 Vasylko 应该进行的移动步骤。

你可以获得部分分,详情见下文。

输入格式

第一行包含一个整数 $n$ ($3 \le n \le 1000$) —— 正方形的大小。

输出格式

第一行输出一个整数 $k$ ($1 \le k \le 10^6$) —— 重新排列立方体所需的最少移动次数。

在接下来的 $k$ 行中,每行输出两个整数 $a$ 和 $b$ ($1 \le a, b \le n$; $a \ne b$),其中 $a$ 是你取出立方体的列号,$b$ 是你放置立方体的列号。

子任务

  • 1. (12 分): $n = 4$;
  • 2. (20 分): $n = 5$;
  • 3. (20 分): $n = 6$;
  • 4. (20 分): $n \le 10$;
  • 5. (20 分): $n \le 100$;
  • 6. (8 分): 无附加限制。

对于每个测试点块(子任务),如果你对该块中的每个测试点都输出了正确的 $k$,你可以获得该块一半的分数。如果你输出的 $k$ 不正确,但移动指令是正确的,你将获得该块四分之一的分数;在这种情况下,要求 $k \le 10^6$。

请注意,要获得一半的分数,你需要输出正确的 $k$,并且:

  • 要么不输出其他任何内容;即仅输出 $k$,不输出任何指令;
  • 要么完整输出所有 $k$ 条指令,其中所有列号都在 $1$ 到 $n$ 之间。对这些指令没有其他正确性要求。

如果你输出的指令数量不等于 $k$(例如,只输出了几条指令,或者输出了太多指令),或者输出了不属于列号的数字等,你将获得 0 分。

样例不提供部分分,其分值为 0 分。

当 $n = 3$ 时,获得一半分数的输出可能如下所示:

8

或者如下所示:

8
1 2
2 1
1 2
2 1
1 2
2 1
1 2
2 1

当 $n = 3$ 时,获得四分之一分数的输出可能如下所示:

10
1 3
3 1
3 2
1 3
2 1
2 3
1 3
2 3
1 2
3 2

如果你输出的指令数量不等于 $k$,你将获得 0 分:

8
1 3
3 1
3 2
1 3
2 1
2 3
1 3
2 3
1 2
3 2

样例

输入样例 1

3

输出样例 1

8
3 2
1 3
2 1
2 3
1 3
2 3
1 2
3 2

说明

首先,我们将放置最后一列。因此,在最少移动次数下,重新排列立方体的唯一第一步可能是将 $3$ 从第三列移动到第二列,因为如果我们不移动 $3$ 或者不把它移动到第二列,我们将无法在第三列的开头放置 $1$。

前 3 个状态

在我们放置了 $1$ 之后,我们需要将 $2$ 和 $3$ 放置在第三列的对应位置上。同样,唯一的办法是先将 $3$ 移动到第一列,因为否则我们在下一步中将无法在第三列中放置 $2$,然后再将 $3$ 放置到它的位置上。

接下来的 3 个状态

在此之后,我们希望正确放置第二列。为了让 $1$ 成为第一个数字,我们首先需要拿走 $2$,而我们只能将其放入最后一列。在放置了 $1$ 之后,我们只需要将 $2$ 放回第二列,即可达到立方体所需的最终状态。

最后 3 个状态

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.