js版
// arr为绳长数组, m为需要裁剪成的绳数
var longestRope = function(arr, m) {
arr.sort((a, b) => {
return a - b
})
let lower = 0
let higher = arr[arr.length - 1]
while((higher - lower) > 0.001) {
let mid = (lower + higher) / 2
if (enough(arr, m, mid)) {
lower = mid
} else {
higher = mid
}
}
return toDecimal(lower, 2)
}
function enough(arr, m, ropeLength) {
let sum = 0
let len = arr.length
for(let i = 0; i < len; i ++) {
sum += parseInt(arr[i] / ropeLength)
if (sum >= m) {
return true
}
}
return false
}
// 保留n位小数,不足补0
function toDecimal(number, n) {
number = number.toFixed(n)
let index = number.indexOf('.')
if (index < 0) {
index = s.length
number += '.'
}
while (number.length <= index + n) {
number += '0'
}
return number
}
// 测试用例
let arr = [3, 4, 5]
console.log(longestRope(arr, 4)) // 2.50