一尘不染

解决问题清单所需的最少天数

algorithm

您需要完成编号为1..N的N个问题。您已经按难度递增的顺序排列了问题,第i个问题的估计难度为i。您还为每个问题分配了评级vi。vi值相似的问题本质上是相似的。每天,您将选择一部分问题并加以解决。您已经决定,当天要解决的每个后续问题都比当天要解决的上一个问题要困难。另外,为了避免感到无聊,您要解决的连续问题在Vi评分上的差异应至少为K。可以解决所有问题的最少天数是多少?

输入:第一行包含测试用例T的数量。后面是T个测试用例。每个案例的第一行都包含整数N和K,第二行后是整数v1,…,vn。

输出:输出T行,每个测试用例一条,包含可以解决所有问题的最少天数。

约束条件:
1 <= T <= 100
1 <= N <= 300
1 <= vi <= 1000
1 <= K <= 1000

样本输入:
2
3 2
5 4 7
5 1
5 3 4 5 6

样本输出:
2
1

这是来自采访街的挑战之一。
下面是我的方法,
从第一个问题开始,找出最大可能解决的问题并将这些问题从问题列表中删除。现在再次从剩余列表的第一个元素开始,直到现在问题列表的大小为0我从这种方法得到了错误的答案,因此正在寻找一些算法来解决这一挑战。


阅读 276

收藏
2020-07-28

共1个答案

一尘不染

通过以下方式构造问题的DAG。令 p i_和
_p j_是两个不同的问题。然后,当且仅当 _p
j 可以 在* p i 之后 的同一天 直接 连续求解时,我们才会从
_p i_到 _p j_绘制有向边。即,必须满足以下条件: __
*__

  1. i <j,因为您应该尽早解决难度较小的问题。
  2. | v i - v j | > = K(评级要求)。

现在注意,选择在某天解决的问题的每个子集都对应于该DAG中的 定向路径
。您选择第一个问题,然后逐步进行操作,路径中的每个边缘对应于在同一天连续解决的一对问题。同样,每个问题只能解决一次,因此DAG中的任何节点都只能出现在一条路径上。而且您必须解决所有问题,因此这些路径应涵盖所有DAG。

现在,我们面临以下问题:给定 n个 节点的DAG ,找到完全覆盖此DAG的最少数量的非交叉定向路径。这是一个众所周知的问题,称为Path
cover
。一般来说,它是NP难的。但是,我们的有向图是非 循环的
,对于非循环图,它可以使用匹配问题的归约在多项式时间内求解。反过来,最大匹配问题可以使用例如Hopcroft-
Karp算法
解决。确切的归约方法很容易,例如可以在Wikipedia上阅读。对于原始DAG的每个有向边
(u,v) ,应添加无向边 (a ub v)_到二部图,其中 是大小 _n的 两个部分。

生成的二分图的每个部分中的节点数等于原始DAG中的节点数 n 。我们知道,在霍普克洛夫特-卡普算法运行 _为O(n 2.5),_在最坏的情况下,和300
2.5 ≈1 558 845 100对于测试这种算法应该采取下一个总额1秒。

2020-07-28