算法91----切绳子
不能一、题目:切绳子
有n根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对n根绳子进行任意裁剪(不能拼接),计算出这m根绳子最长的长度是多少。
输入:第一行2个正整数N,M,表示N根原始的绳子,和最终需要M根绳子数
第二行包含N 个整数,第i个整数Li表示第i根绳子的长度
其中,1≤N、M≤100000,0 <Li<1000000000
输出一个数字,表示裁剪后最长的长度,保留两位小数。
输入:
3 4
3 5 4
输出:
2.5
二、思路:
在绳子长度中进行二分查找最长的长度,然后计算能切出来的绳子根数总和,如果能达到则返回结果。
三、代码
def cut(L,n,m): sumN = 0 for i in range(n): sumN += L[i] if sumN < m: print(0) return False if n >= m: print(L[0])
#l为最大长度/m,u为所有长度和/m。 l , u = max(L)/m , sumN(L)/m while round(l,3) < round(u,3): mid = (l + u ) / 2 sumN = 0 for i in range(n): sumN += L[i] // mid if sumN < m: u = mid else: l = mid print(round(l,2)) return True n , m = input().split() n , m = int(n) , int(m) L = list(map(int,input().split())) cut(L,n,m)