有n根绳子,第i根绳子长度为li,现在需要m根等长的绳子,你可以对n根绳子进行任意裁剪(不能拼接),请你帮忙计算出这m根绳子最长的长度是多少。
时间: 2023-06-05 13:47:45 浏览: 143
将n根绳子中最长的那根绳子记为max_len,最短的那根绳子记为min_len。由于要将n根绳子裁剪成m根等长的绳子,所以最长的绳子长度不能超过max_len/m,最短的绳子长度不能小于min_len/m。
因此,我们可以使用二分查找来确定最长的绳子长度。假设当前二分的区间为[l, r],则取mid=(l+r)/2作为绳子长度进行判断。遍历n根绳子,将每根绳子长度除以mid,得到的商之和记为cnt。如果cnt>=m,则说明当前绳子长度可以满足要求,将区间左端点更新为mid+1;否则,说明当前绳子长度不足以满足要求,将区间右端点更新为mid-1。
最终,当l>r时,区间右端点即为所求的最长绳子长度。
相关问题
有一根长度为n的绳子,将它分成m段,每段的长度设为x,求x为何值时,各段长度的乘积最大,用java代码写出来
这是一个经典的数学问题,可以使用贪心算法来解决。
具体来说,我们可以通过对乘积函数求导来找到函数的极值点,从而确定各段长度的最优解。
假设绳子长度为n,分成m段,每段长度为x,那么各段长度的乘积为:
P = x^m
取对数得:
log(P) = m * log(x)
对log(P)求导,得:
d(log(P)) / dx = m / x
当导数等于0时,log(P)取得最大值,因此:
m / x = 0
解得x = n / m
因此,当各段长度均等时,乘积最大。
以下是Java代码实现:
```java
public class Main {
public static void main(String[] args) {
int n = 10; // 绳子长度为10
int m = 3; // 分成3段
double x = n / (double) m; // 计算每段长度
System.out.println("各段长度为:" + x);
}
}
```
长m的绳子,每天用一半,n天后的长度,c++
每天使用一半,则n天后长度为:
$\frac{1}{2} \times \frac{1}{2} \times \frac{1}{2} \times ... \times \frac{1}{2} \times m$
共有n个$\frac{1}{2}$相乘,所以可以表示为:
$\frac{1}{2^n} \times m$
即长度为:
$c = \frac{1}{2^n} \times m$
相关推荐
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)