QOJ.ac

QOJ

時間限制: 0.5 s 記憶體限制: 1024 MB 總分: 100

#10524. 位串重排

统计

你需要将给定的位串按照指定要求进行重排。唯一允许的操作是交换相邻的位。请编写一个程序,计算所需的最小交换次数。

初始位串由一系列位表示,而目标位串由游程编码(run-length code)指定。位串的游程编码是位串中连续的零或一的最大序列长度序列。例如,“011100”的游程编码为“1 3 2”。注意,具有相同游程编码的位串有两种,一种以 0 开头,另一种以 1 开头。目标位串是这两种中的任意一种。

在样例 1 中,位串“100101”需要重排,使其游程编码为“1 3 2”,这意味着目标位串要么是“100011”,要么是“011100”。要得到“011100”至少需要 4 次交换。另一方面,要得到“100011”仅需 1 次交换。因此,在这个例子中,答案是 1。

输入格式

输入包含一组测试用例。测试用例格式如下:

$N \ M$ $b_1 \ b_2 \dots b_N$ $p_1 \ p_2 \dots p_M$

第一行包含两个整数 $N$ ($1 \le N \le 15$) 和 $M$ ($1 \le M \le N$)。第二行通过 $N$ 个整数指定初始位串。每个整数 $b_i$ 为 0 或 1。第三行包含游程编码,由 $M$ 个整数组成。整数 $p_1$ 到 $p_M$ 表示位串中连续零或一序列的长度,从左到右排列。这里,$1 \le p_j$ 对于 $1 \le j \le M$ 成立,且 $\sum_{j=1}^{M} p_j = N$。保证初始位串可以重排为游程编码为 $p_1, \dots, p_M$ 的位串。

输出格式

输出所需的最小交换次数。

样例

样例输入 1

6 3
1 0 0 1 0 1
1 3 2

样例输出 1

1

样例输入 2

7 2
1 1 1 0 0 0 0
4 3

样例输出 2

12

样例输入 3

15 14
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2

样例输出 3

7

样例输入 4

1 1
0
1

样例输出 4

0

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.