摆烂了好几天。。
题目描述
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
思路分析
只能说dfs 真是万能的
这个题目的思路就是 利用深度优先搜索所有的可能性,在利用打擂法得到最大值和最小值, 在利用打擂法得到全局的最小差异
注意
- dfs边界条件为当长木棍数组长度为M时
- 当旧的木棍被合并后,应该从数组内剔除,由于每次合并,总木棍长度应该减少一,所以每次合并与末尾木棍交换即可
代码如下
N,M=map(int,input().split())
nums=list(map(int,input().split()))
res=1e9
def dfs(N):
global res #这句话不加可能就会入坑
#终止条件,当木棍数量降到M
if N==M:
min_num=min(nums[:N])
max_num=max(nums[:N])
tmp_res=max_num-min_num
res=min(tmp_res,res)
return res
for i in range(N):
for j in range(i+1,N):
#合并
nums[i]+=nums[j]
#与最后一个交换,相当于剔除
nums[j],nums[N-1]=nums[N-1],nums[j]
dfs(N-1)
#换回来
nums[j],nums[N-1]=nums[N-1],nums[j]
#减回去
nums[i]-=nums[j]
dfs(N)
print(res)