在给定N-1个约束的情况下,计算小于整数N的数字的可能排列数
Count the number of possible permutations of numbers less than integer N, given N-1 constraints
我们得到了一个整数N
,我们需要计算小于N的数字的排列总数。我们还得到了N-1
约束。例如:
如果N=4
,则计数给定的0,1,2,3
的排列:
0>1
0>2
0>3
我想做一个图,然后计算同一级别的数字排列的总数,并将其与其他级别的排列相乘。例如:
例如:
0
/ |
/ |
1 2 3 ------> 3!=6 So total no of permutations are 6.
但是我在C++
中实现它有困难。此外,这个问题是在Facebook黑客杯上被问到的,比赛现在结束了。我看过其他人的代码,发现他们使用DFS
。有什么帮助吗?
实现这一点的最简单方法是使用标准排列生成器,并过滤掉每个违反条件的排列。这显然是非常低效的,并且对于较大的N值是不可计算的。这样做有点像这些比赛中的"愚蠢"选项,可以让不那么聪明的参赛者完成问题。
熟练的方法需要深入了解计算组合和排列的方法。为了说明这种方法,我将举一个例子。输入:
N = 7
2 < 4
0 < 3
3 < 6
我们首先通过将相关条件组合为一个条件来简化这一点,如下所示:
2 < 4
0 < 3 < 6
从最长的条件开始,确定差距的组合计数(这是关键的见解)。例如,一些组合如下:
XXXX036
XXX0X36
XXX03X6
XXX036X
XX0XX36
etc.
现在,你可以看到有4个缺口:?0?3.6.我们需要计算X在这四个间隙中的可能分区。这样的分区数量是(7选3)=35(你明白为什么了吗?)。现在,我们接下来乘以下一个条件的组合,即2<4在剩余的空白点(X)上。我们可以相乘,因为这个条件完全独立于0<3<6条件。此组合计数为(4选择2)=6。最终条件在2个点中有2个值=2!=2.因此,答案是35 x 6 x 2=420。
现在,让我们把它稍微复杂一点。添加条件:
1 < 6
这样改变计算的方式是036之前必须按该顺序出现。但是,现在,我们有三种可能的安排:
1036
0136
0316
因此,总计数现在是(7选择4)x 3 x(3选择2)=35 x 3 x 3=315。
因此,概括一下,程序就是将问题隔离到独立的条件中。对于每个独立的条件,计算分区的组合,然后将它们相乘。
我已经手动浏览了这个示例,但您可以对相同的过程进行编程。
- 检查输入是否不是整数或数字
- 如何找到大于整数的最小数字
- 在数字之间插入 + 或 - 符号以使其等于整数
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 整数区间(或 int 数组)中每个数字的出现次数
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- 分隔整数 (C++) 的数字
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- C++:从文件中读取字符串和整数,并获得最大数字
- 如何在C ++中替换整数的前两位数字?
- 如何计算整数的十进制数字?
- 如何计算整数链中使用了多少次数字?
- 为什么这个程序接受整数和字母数字输入并打印它们? C++ 中的 std::string 也采用整数值吗?
- R 中的算术在数字上比整数更快。这是怎么回事?
- 我想使用 std::stoi 函数在 cpp 中将字符串转换为整数,因为我想在字符串中找到不同数字的总和(在下级酶中)
- C++以字符串形式打印出来的整数数字
- 使用C - CIN获取几个整数数字,然后将它们放入数组中
- C++整数数字逐行
- 为什么将'0'添加到整数数字可以转换为字符?