解决问题列表所需的最少天数

时间:2012-04-24 18:24:37

标签: algorithm graph-algorithm

您需要完成N个问题,编号为1..N。你已经安排了增加难度顺序的问题,并且第i个问题估计了难度级别i。您还为每个问题分配了一个评级vi。类似vi值的问题在性质上是类似的。在每一天,您将选择一部分问题并解决它们。您已经确定当天解决的每个后续问题应该比您当天解决的上一个问题更难。另外,为了不让它变得无聊,你解决的连续问题应该在vi等级上至少为K.你可以解决所有问题的最少天数是多少?

输入: 第一行包含测试用例的数量T.T测试用例如下。每个案例在第一行包含一个整数N和K,在第二行包含整数v1,...,vn。

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

约束:
1< = T< = 100
1 <= N <= 300
1&lt; = vi&lt; = 1000
1 <= K <= 1000

示例输入:
2
3 2
5 4 7
5 1
5 3 4 5 6

样品输出:
2
1个

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

4 个答案:

答案 0 :(得分:16)

以下列方式构建DAG个问题。让 p i p j 是两个不同的问题。然后我们将从 p i p j 绘制有向边,当且仅当 p < sub> j 可以在同一天 p i 之后直接解决。即,必须满足以下条件:

  1. i&lt; j ,因为你应该先解决那个不太困难的问题。
  2. | v i - v j | &gt; = K(评级要求)。
  3. 现在请注意,选择在某一天解决的每个问题子集都对应于该DAG中的定向路径。您选择第一个问题,然后逐步跟踪边缘,路径中的每个边对应于在同一天连续求解的一对问题。此外,每个问题只能解决一次,因此我们的DAG中的任何节点可能只出现在一个路径中。而且你必须解决所有问题,因此这些路径应涵盖所有DAG。

    现在我们遇到以下问题:给定 n 节点的DAG,找到完全覆盖此DAG的最小数量的非交叉定向路径。这是一个众所周知的问题Path cover。一般来说,它是NP难的。但是,我们的有向图是非循环,对于非循环图,它可以使用简化为matching problem在多项式时间内求解。反过来,最大匹配问题可以使用Hopcroft-Karp algorithm来解决。确切的简化方法很简单,可以阅读,比如on Wikipedia。对于原始DAG的每个有向边(u,v),应添加无向边(a u b v 到二分图,其中 {a i } {b i } 是大小 n 的两部分。

    生成的二分图的每个部分中的节点数等于原始DAG中的节点数 n 。我们知道Hopcroft-Karp算法在最坏的情况下运行在 O(n 2.5 ,并且300 2.5 ≈1558 845.对于100测试此算法总共需要1秒钟。

答案 1 :(得分:2)

算法很简单。首先,按v_i对问题进行排序,然后针对每个问题,找出区间(v_i-K, v_i]中的问题数量。这些数字的最大值就是结果。第二阶段可以在O(n)中完成,因此最昂贵的操作是排序,制作整个算法O(n log n)Look here for a demonstration of the work of the algorithm on your data and K=35 in a spreadsheet.

为什么这样做

让我们将问题重新表述为图着色问题。我们按如下方式创建图G:顶点将是问题,如果|v_i - v_j| < K,则两个问题之间会存在边缘。

在这样的图中,独立集完全对应于同一天可行的问题集。 (&lt; =)如果该集合可以在一天完成,那肯定是一个独立的集合。 (=&gt;)如果集合不包含两个不满足K差分标准的问题,您可以根据难度对它们进行排序并按此顺序求解。这两种情况都会得到满足。

因此,很容易看出图G的颜色与不同日期的问题时间表完全一致,每种颜色对应一天。

所以,我们想要找到图G的色度。一旦我们认识到图是一个区间图,这是一个完美的图,那些具有与集团相等的色度,并且两者都可以通过简单找到算法

间隔图是实线上的间隔图,边是相交的间隔。我们可以很容易地看到,我们的图是一个区间图(对于每个问题,分配一个区间(v_i-K, v_i]。可以很容易地看出,这个区间图的边缘恰好是图的边缘。) p>

引理1 :在区间图中,存在一个顶点,其邻居形成一个集团。

证明很简单。您只需使用所有的最低上限(或最高下限)的区间。与其相交的任何间隔都具有较高的上限,因此,第一个间隔的上限包含在它们的交集中。因此,它们相互交叉,形成一个集团。 QED

引理2 :在一系列关于诱导子图的图上,并且具有引理1的属性(顶点的存在,其邻居形成一个集团),以下算法产生最小的着色:

  1. 找到顶点 x ,其邻居形成一个集团。
  2. 从图表中删除 x ,使其子图G'。
  3. 彩色G'递归
  4. 使用在其邻居中找不到的最少颜色 x
  5. 证明:在(3)中,算法通过归纳假设+我们家族在诱导子图上的亲密度产生子图G'的最佳着色。在(4)中,如果在 x 的邻居上存在大小为n的团,则算法仅选择新颜色n-1。这意味着,使用 x ,G中有一个大小为n的集团,因此其色度必须至少为n。因此,算法给出顶点的颜色总是<= chromaticity(G),这意味着着色是最佳的。 (显然,该算法产生有效的着色)。 QED

    推论:区间图是完美的(完美的<=>色度== cliqueness)

    所以我们必须找到G的集团。对于区间图来说这很容易:你只需要处理不包含区间边界的实线的分段,并计算相交的区间数,这在你的在这种情况下,间隔长度均匀。这导致了本文开头概述的算法。

答案 2 :(得分:0)

我们真的需要去路径掩护吗?我们不能遵循与LIS类似的策略。

输入的复杂程度越来越高。我们只需要为每天要执行的任务维护一堆队列。通过比较所有队列的最后元素,输入中的每个元素都将分配给一天。无论我们在哪里发现&#39; k&#39;我们将任务附加到该列表中。

例如:5 3 4 5 6

1)输入 - &gt; 5(空列表因此开始一个新的)

5

2)3(仅列表5&amp; abs(5-3)为2(k)所以附加3)

5 - &GT; 3

3)4(仅列出最后一个vi,3和abs(3-4)&lt; k,所以开始一个新列表)

5 - &GT; 3

4

4)5再次(abs(3-5)= k追加)

5 - →3 - →5

4

5)6再次(abs(5-6)&lt; k但abs(4-6)= k)附加到第二个列表)

5 - →3 - →5

4 - →6

我们只需要维护一个包含每个列表的最后元素的数组。由于天的顺序(当任务要完成时并不重要),我们可以维护最后任务的排序列表,因此,搜索插入新任务的地方只是寻找可以完成的值abs(vi-k)通过二进制搜索。

复杂度:

循环运行N个元素。在最坏的情况下,我们可能最终使用二进制搜索(log i)查询ceil值以获得许多输入[i]。

因此,T(n)&lt; O(log N!)= O(N log N)。分析以确保上限和下限也是O(N log N)。复杂性是THETA(N log N)。

答案 3 :(得分:0)

所需的最小天数与G(DAG)的互补(无向)图中最长路径的长度相同。这可以用迪尔沃思定理来解决。