有关如何根据给定条件找到标记给定数组的所有元素的最小步数的任何提示?

时间:2012-07-02 10:05:00

标签: c algorithm

给出了两个整数N<=10^5K<=N,其中N是数组A[]的大小,K是我们可以选择的连续子序列的长度在我们的过程中。每个元素A[i]<=10^9。现在假设最初所有数组元素都没有标记。在每个步骤中,我们将选择长度为K的任何子序列,如果此子序列具有未标记的元素,那么我们将标记所有未标记的元素,这些元素在后序中是最小的。现在如何计算标记所有元素的最小步数?

为了更好地理解问题,请参阅此示例 -

N=5 K=3 A[]=40 30 40 30 40

步骤1-选择间隔[1,3]并标记A [1]和A [3]

步骤2 - 选择间隔[0,2]并标记A [0]和A [2]

步骤3-选择间隔[2,4]并标记A [4]

因此,此处的最小步骤数为3.

我的方法(速度不够快) -

我从数组的第一个元素开始,并在距离<=K处将所有未标记的元素标记为等于它,并将steps递增1.

3 个答案:

答案 0 :(得分:3)

首先考虑如何回答K == N的问题(即对子序列的长度没有任何有效的限制)。您的答案应该是最小步数是数组中不同值的数量。

然后考虑当K减少时这会如何变化;重要的是K长度间隔的副本数量需要覆盖{i: A[i] == n}中每个值n的选择集A。沿着K行走A - 长度间隔的天真算法,在A[i]的值尚未覆盖的每个位置n停止是完全足够的。

答案 1 :(得分:1)

我们看到最小步数= N / k或N / k + 1且最大步数=(n + k-1)。 我们必须优化步骤的总数,这取决于我们所做的选择的过去历史,这些选择涉及动态解决方案。

有关动态理论教程,请参阅http://www.quora.com/Dynamic-Programming/How-do-I-get-better-at-DP-Are-there-some-good-resources-or-tutorials-on-it-like-the-TopCoder-tutorial-on-DP/answer/Michal-Danil%C3%A1k

答案 2 :(得分:0)

可以在O(n)中解决如下: 跟踪每个元素a [i]。如果之前未跟踪[i],则映射数字及其索引并增加计数器。如果先前跟踪了数字,则检查其(最后一个index-curr_index)&gt; = K是否更新索引并增加计数。打印计数。 地图STL将是有益的。