筆試編程題彙總(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))
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章