如何使用 javascript 找到完成从 A 点到 B 点的这项工作的最少行程次数?
How to find minimum number of trips to do in order to complete this work from point A to point B using javascript?
所以我正在解决这个问题:
有些袋子的重量从 1 到 3 个单位不等,我必须将它们从 A 点搬运到 B 点。
重量由数组中的袋子给出。所有重量都小于3个单位。
weights = [1, 1.78, 2.2, 2.73, 3]
所以我要使旅行携带的行李总重量不要超过3个单位。为此,我必须进行最少的行程。
示例:
权重 = [1.01, 1.99, 2.5, 1.5, 1.01]
我至少可以携带所有行李 3 次:
[1.01 + 1.99, 2.5, 1.5 + 1.01].
表示如何确定最小编号。从 A 点到 B 点携带重量袋的行程?
可以应用什么逻辑?
这里我用了贪心的方法,就是对weights数组进行排序,把最重的和最轻的结合起来,直到达到极限。 Python代码:
def solve(A):
A.sort()
n = len(A)
i =0
j = n-1
ans=0
while i<=j:
while A[i]+A[j] <=3:
i+=1
ans+=1
j-=1
return ans
print(solve([1.01, 1.99, 2.5, 1.5, 1.01]))
时间复杂度:O(n)
一种方法是遍历一个排序列表,总是先选出最大的数字。
然后循环遍历剩余的元素并将其与最大数组合,组合总和小于目标。
因为最大的数字应该总是最难“配对”的,这应该会给你最佳的行程数。
然而,这种方法并没有均匀分配权重。它将有利于尽可能大的打包对。
这是一个简单的实现:
function SplitToBalancedPairs(inputs, target) {
let outputs = [];
inputs = inputs.slice(0).sort((a, b) => a - b);
while (inputs.length > 0) {
let a = inputs.pop();
let b;
let c;
for (let i = 0; i < inputs.length; i++) {
b = inputs[i];
if (a + b <= target) {
c = i;
break;
}
}
if (c !== void 0) {
outputs.push([a, inputs.splice(c, 1).pop()]);
}
else {
outputs.push([a]);
}
}
return outputs;
}
//Test
let weights = [1, 1.78, 2.2, 2.73, 3];
let results = SplitToBalancedPairs(weights, 3);
console.log(results);
console.log(results.map(a => a.reduce((b, c) => b + c)));
所以我正在解决这个问题:
有些袋子的重量从 1 到 3 个单位不等,我必须将它们从 A 点搬运到 B 点。 重量由数组中的袋子给出。所有重量都小于3个单位。
weights = [1, 1.78, 2.2, 2.73, 3]
所以我要使旅行携带的行李总重量不要超过3个单位。为此,我必须进行最少的行程。
示例: 权重 = [1.01, 1.99, 2.5, 1.5, 1.01]
我至少可以携带所有行李 3 次:
[1.01 + 1.99, 2.5, 1.5 + 1.01].
表示如何确定最小编号。从 A 点到 B 点携带重量袋的行程?
可以应用什么逻辑?
这里我用了贪心的方法,就是对weights数组进行排序,把最重的和最轻的结合起来,直到达到极限。 Python代码:
def solve(A):
A.sort()
n = len(A)
i =0
j = n-1
ans=0
while i<=j:
while A[i]+A[j] <=3:
i+=1
ans+=1
j-=1
return ans
print(solve([1.01, 1.99, 2.5, 1.5, 1.01]))
时间复杂度:O(n)
一种方法是遍历一个排序列表,总是先选出最大的数字。
然后循环遍历剩余的元素并将其与最大数组合,组合总和小于目标。
因为最大的数字应该总是最难“配对”的,这应该会给你最佳的行程数。
然而,这种方法并没有均匀分配权重。它将有利于尽可能大的打包对。
这是一个简单的实现:
function SplitToBalancedPairs(inputs, target) {
let outputs = [];
inputs = inputs.slice(0).sort((a, b) => a - b);
while (inputs.length > 0) {
let a = inputs.pop();
let b;
let c;
for (let i = 0; i < inputs.length; i++) {
b = inputs[i];
if (a + b <= target) {
c = i;
break;
}
}
if (c !== void 0) {
outputs.push([a, inputs.splice(c, 1).pop()]);
}
else {
outputs.push([a]);
}
}
return outputs;
}
//Test
let weights = [1, 1.78, 2.2, 2.73, 3];
let results = SplitToBalancedPairs(weights, 3);
console.log(results);
console.log(results.map(a => a.reduce((b, c) => b + c)));