【发布时间】:2020-03-30 16:14:38
【问题描述】:
给定测试用例数 T 和一个整数 N,你需要找到四个整数 A,B,C,D ,它们都是 N(A|N,B|N,C|N, D|N),N=A+B+C+D。目标是最大化 A * B * C * D。如果无法找到这四个因素,只需返回 -1。
问题的输入格式是:
第一行包含一个整数T(1
接下来的 T 行中的每一行都包含一个整数 N(1
这个问题在递归类别下的 Hackerearth 上,但我无法理解社论中的算法(编辑链接:-https://www.hackerearth.com/practice/basic-programming/recursion/recursion-and-backtracking/practice-problems/algorithm/divide-number-a410603f/editorial/)。
在社论中,它已使用单位分数解决,但我无法理解算法(如果您无法打开上述链接,我在下面提供了社论,我无法理解标有***的点)。蛮力解决方案导致 TLE(超出时间限制)。请提供使用 DFS 或回溯的算法或伪代码。
我的蛮力方法:- 计算 O(sqrt(n)) 中数字“n”的因数并将它们存储在一个数组中,然后使用四个 for 循环遍历数组以获取 A、B、C、D .但是对于 T(1
社论(如果您无法打开以上链接):-
考虑方程 N = A+B+C+D ,如果我们将方程除以 N ,我们得到 1 = 1/A' + 1/B' + 1/C' + 1/D' ,这里是 A ',B',C',D'都是整数,因为A,B,C,D是N的因数。
所以原来的问题等于把1分成四个单位分数。
我们可以从大到小枚举单位分数。
***如果我们需要将X分成Y个单位分数,而最后一个单位分数是1/Z,我们可以枚举1/Z和X/Y之间的单位分数(因为我们是在枚举剩余的最大分数) ,并递归求解。
*** 找到 1 = 1/A' + 1/B' + 1/C' + 1/D' 的所有解后(如果数字按顺序大约有 20 个解),我们可以在每个解中枚举它们测试用例。如果A',B',C',D'都是N的因数,我们可以用这个解来更新答案。
时间复杂度:O(T),其中 T 是测试用例的数量。
【问题讨论】:
标签: algorithm recursion depth-first-search number-theory