Python蓝桥杯ALGO-997 粘木棍

摆烂了好几天。。

题目描述

问题描述
  有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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值