#P2698. Servicing DVD Requests

Servicing DVD Requests

描述

你正在经营一个DVDDVD图书馆。假设你有kkDVDDVD驱动器,用户可以通过这些驱动器访问所请求的DVDDVD内容。一个DVDDVD驱动器在同一时间只能访问一张DVDDVD的内容。当收到一个DVDDVD请求时,如果该DVDDVD已经在某个驱动器中,则无需任何操作。否则,你需要将请求的DVDDVD插入一个空的驱动器。如果所有kk个驱动器都已占用,则必须先从某个驱动器中移除一张DVDDVD,再将请求的DVDDVD插入该驱动器。目标是为整个请求序列提供服务时,最小化所需的DVDDVD插入次数。

为了使问题更有趣,我们假设你已提前获知整个请求序列x1,x2,,xnx_1, x_2, \ldots, x_n。此外,你必须按照顺序处理请求,即在处理xi+1x_{i+1}之前必须先处理xix_i,其中i=1,2,,n1i = 1, 2, \ldots, n - 1。你需要仔细规划如何处理每个请求,以使总DVDDVD插入次数最小。显然,难点在于当收到一个未被任何驱动器缓存的DVDDVD请求且所有驱动器都已占用时,如何确定应该移除哪张DVDDVD

例如,设k=2k = 2,请求序列为1,2,3,1,3,1,31, 2, 3, 1, 3, 1, 3。对于前两个请求,只需将DVDDVD 1122分别插入两个驱动器。当第三个请求(即DVD3DVD 3)到达时,你必须从驱动器中移除DVD1DVD 1DVD2DVD 2,以便将DVD3DVD 3插入其中一个驱动器。

  • 如果选择第一种方案(即移除DVD1DVD 1),则剩余的请求(即请求474-7)至少需要再进行一次DVDDVD插入。
  • 如果选择第二种方案(即移除DVD2DVD 2),则剩余的请求(即请求474-7)无需再进行任何DVDDVD插入。

不难验证,第二种方案是处理上述请求序列的最优方式,仅需三次DVDDVD插入。

输入

第一行包含测试用例的数量mm。每个测试用例的第一行包含两个数字kknn,其中1k101 \leq k \leq 10DVDDVD驱动器的数量,1n1001 \leq n \leq 100是请求的数量。接下来的nn行中,第ii行包含第ii个请求xix_i

输出

对于每个测试用例,你的程序需要在一行中输出处理整个请求序列所需的最小DVDDVD插入次数。

输入数据 11

2
2 7
1
2
3
1
3
1
3
3 9
1
2
3
4
1
2
1
2
4

输出数据 11

3
4

来源

台湾 2004