【问题标题】:A fast algorithm instead of permutation [closed]一种快速算法而不是排列[关闭]
【发布时间】:2016-05-21 11:50:39
【问题描述】:

我需要找到一种快速算法来解决以下输入和输出的问题。

输入:

n 对整数作为操作数和三个运算符(+,-,*)

输出:

如果有人可以将运算符放在所有操作数之间,结果是 n 个不同的数字,程序会说:“这是可能的。”。否则它会说:“这是不可能的。”。另一方面,运算符的重复是允许的,但结果是不允许的。通常的方法是使用置换;但这非常耗时。

一个例子:

Input:
3  5 
2  1
6  3
Output:
Possible

在本例中,一种可能性是第一对操作数使用“-”运算符,其余操作数使用“+”运算符。

有人可以帮助我解决这个问题的快速算法吗(我也必须使用 c++)?

【问题讨论】:

  • 向我们展示一些您迄今为止尝试过的代码。
  • read about how to ask good questions?你知道如何创建Minimal, Complete, and Verifiable Example吗?如果没有,请点击链接并阅读文章。
  • 我没有尝试任何代码,因为我将首先设计它的算法。
  • @alikefayati Stack Overflow 是一个关于代码的问答网站。如果主要关注算法设计,您可能会在programmers.stackexchange.com 或其他 Stack Exchange 网站上获得更好的运气。
  • 如果你去programmers.se,发帖前请阅读他们的规则!

标签: c++ algorithm linear-algebra graph-algorithm


【解决方案1】:

你可以把它变成一个最大流量问题。

让我们用N 表示对(方程)的数量。

首先,请注意,对于每一对,我们最多有三个可能的结果(因为我们有三个运算符)。

考虑所有方程的所有可能结果的集合,让我们将这组数字表示为A

构造一个图G,它将有两个特殊节点s(源),t(汇),一个节点对应A的每个元素,最后,每个节点对应一个节点N 输入的数字对。

G 的边将按如下方式创建:

  • sA 对应的每个节点的一条边。
  • 从对应于A 的每个节点到对应于一对数字的每个节点的一条边可以产生来自A 的相应结果(请记住,每个输入对可能产生3 个不同的值)。
  • 从对应于一个方程的每个节点的一条边到接收器t

为这些边中的每一个分配一个等于 1 的容量。

现在,运行最大流量算法。如果流的值等于N,那么我们可以产生N不同的结果。

确实,为了让N 流到达接收器,我们必须从前一层中的每个N 方程中获得一个流。我们还可以通过查看每个方程从A 中的哪个数字获得其单位输入流来恢复解。


编辑:

对于以下输入对,请参见下面的上述算法的可视化:

3 1
2 2
2 1

A 的集合是{2, 4, 3, 0, 1}。一些数字可以从多对中获得,例如 2 = 3 - 1 = 2 * 1。这样做的效果是编号为2的节点既连接到3 1的节点,也连接到2 1的节点。

所有边都有单位容量(如上所述)。

在从st 运行最大流量算法后,结果为3,提供此流量的一种可能方式由粗体边缘表示。这种情况下产生的解决方案是2 = 3 - 1,4 = 2 * 2,1 = 2 - 1;

【讨论】:

  • 谢谢。事实上,这个问题的最佳算法是最大流量。但我的问题是将问题更改为最大流量问题。因为我不熟悉。你的解释很有帮助。但是你能举个例子吗?
  • 我很高兴它有帮助,我会在今天晚些时候画一个例子。
  • @alikefayati 完成,感谢您的接受,如果还有什么不清楚的地方请告诉我。
  • 非常感谢。我会编写程序并将结果反馈给您。
猜你喜欢
  • 2017-05-12
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2010-12-03
  • 1970-01-01
相关资源
最近更新 更多