【发布时间】:2015-09-25 10:04:42
【问题描述】:
你会怎么解决这个问题?
您有 2 个数组,每个数组有 n 个数字,n
例如:
n = 4;
first array contains : 16 6 2 10
second array contains : 3 8 12 9
Output : 336
对于第二个数组中的第一个数字 - 3 - 您可以从 16,6 和 2. 最好的选择是选择 2. 现在总和是 3 * 2 = 6;
对于第二个数组中的第二个数字 - 8 - 您可以从 16、6、10 中选择(数字 2 是 已经使用过的)。最好的选择是选择 6。将 8 * 6 加到 sum 上,所以 sum 是 现在 54.
对于第二个数组中的第三个数字 - 12 您可以选择 16,10(2 号和 6 号已使用)。最好的选择是选择 16。 加 12 * 16 到 sum,所以 sum 现在是 246。
从第二个开始的最后一个数字 数组 - 9 - 你只能选择 10。将 9 * 10 加到 sum 中,所以 sum 现在是 336.
我的想法很少,但每个想法都是错误的。例如,我尝试对两个数组进行排序,然后第二个数组中的最大数字乘以第一个数组中的最大可能数字(因为 1. 第二个数组中的数字只能从第一个数组中的 1.-3. 位置中选择,第二个数字只能选择从 1.-4. 等),但这是不对的。另外我还有一些解决方案,但我很难解释它们,因为我不知道如何用英语表达它(但我可以发布代码并尝试解释它),而且它们也不正确。
编辑:我发现了一些可能解决我的问题的算法。第一个是Hungarian algorithm,第二个是Auction Algorithm。这是我第一次接触线性规划...我了解匈牙利算法的工作原理,但我无法实现。在拍卖算法中,我什至不确定它是如何工作的。另外,我不知道他们是否足够快。匈牙利算法的时间复杂度是 O(n^3),在我的例子中我是 n Assignment problem 中,每个“工人”都可以做每一个“工作”,但在我的情况下,这不是真的。
也许可以是Max flow problem,但我不太确定,因为我需要一个完美的匹配——这意味着每个顶点都匹配——我不知道这个算法是否能保证。
【问题讨论】:
-
你可以用蛮力做吗?
-
不,我无法使用暴力破解
-
为什么不用蛮力?作业/理论问题?你想这么解决“真正的问题”(多大)?
-
这是来自网页的任务,具有测试条目和时间限制,这就是为什么没有暴力破解的原因。我通过此页面执行任务以提高我的技能。
标签: c++ arrays sum mathematical-optimization linear-programming