笔试编程题汇总(6)

"""
给一个长度为N的整数数组,将这个数组分成M段,每一段的和为这一段的权重,所有段的权重的最大值为这次分割的权重,求所有分割中最小的权重
输入描述:
    第一行是两个整数,表示N, M (M<=N)
    第二行数N个空格分割的整数
输出:
    输出所有分割中最小的权重

样例:
    input:
        5 3
        1 4 2 3 5
    output:
        5

"""


import sys

def find_min(data):
    min_data, min_idx = data[0], 0
    for idx, data_temp in enumerate(data):
        if data_temp<min_data:
            min_data = data_temp
            min_idx = idx
    return min_data, min_idx

def merge_once(data, sum_data):
    min_data, min_idx = find_min(sum_data)
    
    data = data[:min_idx]+[min_data]+data[min_idx+2:]

    sum_data[min_idx-1] = data[min_idx-1]+data[min_idx]
    if not min_idx==len(sum_data)-1:
        sum_data[min_idx+1] = data[min_idx]+data[min_idx+1]
    sum_data = sum_data[:min_idx]+sum_data[min_idx+1:]
    return data, sum_data

def get_weight(data, m):

    if m<2:
        return sum(data) 
    sum_data = [data[idx]+data[idx+1] for idx in range(len(data)-1)]
    while len(data)>m:
        data, sum_data = merge_once(data, sum_data)
    return max(data)

if __name__=="__main__":
    line1 = sys.stdin.readline().strip()
    line2 = sys.stdin.readline().strip()

    n,m = line1.split(" ")
    n,m = int(n), int(m)
    data = list(map(int, line2.split()))

    print(get_weight(data, m))
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值